Aller au contenu

Autocomplete

Rechercher et sélectionner parmi une liste d’options avec navigation au clavier et filtrage.

import { Autocomplete } from 'asterui'

Autocomplete basique

Autocomplete simple avec options de tableau de chaînes.

import { Autocomplete } from 'asterui'

function App() {
  const countries = [
    'United States',
    'United Kingdom',
    'Canada',
    'Australia',
    'Germany',
    'France',
  ]
  
  return (
      <Autocomplete
        options={countries}
        placeholder="Select a country"
      />
    )
}

export default App

Avec options objets

Autocomplete avec options objets valeur/libellé.

import { Autocomplete } from 'asterui'

function App() {
  const fruits = [
    { value: 'apple', label: 'Apple' },
    { value: 'banana', label: 'Banana' },
    { value: 'cherry', label: 'Cherry' },
    { value: 'orange', label: 'Orange' },
  ]
  
  return (
      <Autocomplete
        options={fruits}
        placeholder="Select a fruit"
      />
    )
}

export default App

Contrôlé

Autocomplete contrôlé avec gestion d'état.

Selected: None

import { Autocomplete } from 'asterui'
import { useState } from 'react'

function App() {
  const [country, setCountry] = useState('')
  const countries = [
    'United States',
    'United Kingdom',
    'Canada',
    'Australia',
  ]
  
  return (
      <div>
        <Autocomplete
          value={country}
          onChange={setCountry}
          options={countries}
          placeholder="Select a country"
        />
        <p className="mt-2 text-sm text-base-content/70">
          Selected: {country || 'None'}
        </p>
      </div>
    )
}

export default App

Autoriser l'effacement

Autocomplete avec bouton d'effacement.

import { Autocomplete } from 'asterui'
import { useState } from 'react'

function App() {
  const [value, setValue] = useState('Apple')
  const fruits = ['Apple', 'Banana', 'Cherry', 'Orange']
  
  return (
      <Autocomplete
        value={value}
        onChange={setValue}
        options={fruits}
        allowClear
        placeholder="Select a fruit"
      />
    )
}

export default App

Pas de valeurs personnalisées

Autocomplete qui autorise uniquement la sélection parmi les options.

import { Autocomplete } from 'asterui'

function App() {
  const languages = [
    'JavaScript',
    'TypeScript',
    'Python',
    'Java',
    'C++',
  ]
  
  return (
      <Autocomplete
        options={languages}
        allowCustomValue={false}
        placeholder="Select a language"
      />
    )
}

export default App

Filtre personnalisé

Autocomplete avec logique de filtrage personnalisée (commence par).

import { Autocomplete } from 'asterui'

function App() {
  const countries = [
    'United States',
    'United Kingdom',
    'Canada',
    'Australia',
  ]
  
  return (
      <Autocomplete
        options={countries}
        filterOption={(option, input) =>
          option.label.toLowerCase().startsWith(input.toLowerCase())
        }
        placeholder="Type to filter (starts with)"
      />
    )
}

export default App

Différentes tailles

Autocomplete en différentes tailles.

import { Autocomplete, Space } from 'asterui'

function App() {
  const options = ['Option 1', 'Option 2', 'Option 3']
  
  return (
      <Space direction="vertical" size="sm">
        <Autocomplete size="xs" options={options} placeholder="Extra small" />
        <Autocomplete size="sm" options={options} placeholder="Small" />
        <Autocomplete size="md" options={options} placeholder="Medium" />
        <Autocomplete size="lg" options={options} placeholder="Large" />
        <Autocomplete size="xl" options={options} placeholder="Extra large" />
      </Space>
    )
}

export default App

Couleurs

Différentes variantes de couleurs.

import { Autocomplete, Space } from 'asterui'

function App() {
  const options = ['Option 1', 'Option 2', 'Option 3']
  
  return (
      <Space direction="vertical" size="sm">
        <Autocomplete color="primary" options={options} placeholder="Primary" />
        <Autocomplete color="secondary" options={options} placeholder="Secondary" />
        <Autocomplete color="accent" options={options} placeholder="Accent" />
        <Autocomplete color="success" options={options} placeholder="Success" />
        <Autocomplete color="warning" options={options} placeholder="Warning" />
        <Autocomplete color="error" options={options} placeholder="Error" />
      </Space>
    )
}

export default App

Statut de validation

Autocomplete avec statut de validation pour le retour de formulaire.

This field is required

Please verify this value

import { Autocomplete, Space } from 'asterui'

function App() {
  const options = ['Option 1', 'Option 2', 'Option 3']
  
  return (
      <Space direction="vertical" size="sm">
        <div>
          <Autocomplete status="error" options={options} placeholder="Error status" />
          <p className="text-error text-sm mt-1">This field is required</p>
        </div>
        <div>
          <Autocomplete status="warning" options={options} placeholder="Warning status" />
          <p className="text-warning text-sm mt-1">Please verify this value</p>
        </div>
      </Space>
    )
}

export default App

Désactivé

Autocomplete désactivé.

import { Autocomplete } from 'asterui'

function App() {
  const fruits = [
    { value: 'apple', label: 'Apple' },
    { value: 'banana', label: 'Banana' },
  ]
  
  return (
      <Autocomplete
        options={fruits}
        disabled
        defaultValue="apple"
      />
    )
}

export default App

Options désactivées

Les options individuelles peuvent être désactivées.

import { Autocomplete } from 'asterui'

function App() {
  const options = [
    { value: 'opt1', label: 'Available option' },
    { value: 'opt2', label: 'Disabled option', disabled: true },
    { value: 'opt3', label: 'Another available' },
  ]
  
  return (
      <Autocomplete
        options={options}
        placeholder="Some options are disabled"
      />
    )
}

export default App

Contenu personnalisé introuvable

Autocomplete avec message personnalisé en cas d'absence de résultats.

import { Autocomplete } from 'asterui'

function App() {
  return (
      <Autocomplete
        options={['Apple', 'Banana', 'Cherry']}
        notFoundContent="Sorry, no matches found!"
        placeholder="Search fruits"
      />
    )
}

export default App

Autocomplete de domaine email

Exemple pratique avec suggestions de domaines email.

Email: None

import { Autocomplete } from 'asterui'
import { useState } from 'react'

function App() {
  const [email, setEmail] = useState('')
  
  const domains = ['@gmail.com', '@yahoo.com', '@outlook.com', '@hotmail.com']
  
  const emailOptions = email.includes('@')
    ? domains.map(domain => email.split('@')[0] + domain)
    : domains.map(domain => email + domain)
  
  return (
      <div>
        <Autocomplete
          value={email}
          onChange={setEmail}
          options={emailOptions}
          placeholder="Enter email address"
        />
        <p className="mt-2 text-sm text-base-content/70">
          Email: {email || 'None'}
        </p>
      </div>
    )
}

export default App

Dans un formulaire

Autocomplete intégré au composant Form.

 

import { Autocomplete, Form, Button, Modal } from 'asterui'

function App() {
  const handleSubmit = (values: { country: string }) => {
    Modal.success({
      title: 'Form Submitted',
      content: `Country: ${values.country}`,
    })
  }
  
  return (
      <Form onFinish={handleSubmit} initialValues={{ country: 'Canada' }}>
        <Form.Item
          name="country"
          label="Country"
          required
          rules={{ required: 'Please select a country' }}
        >
          <Autocomplete
            options={['United States', 'Canada', 'United Kingdom']}
            placeholder="Select a country"
          />
        </Form.Item>
  
        <Form.Item>
          <Button htmlType="submit" color="primary">
            Submit
          </Button>
        </Form.Item>
      </Form>
    )
}

export default App
PropriétéDescriptionTypeDéfaut
valueValeur contrôléestring-
defaultValueValeur par défaut (non contrôlée)string''
onChangeCallback lorsque la valeur change(value: string) => void-
onSelectCallback lorsqu’une option est sélectionnée(value: string, option: AutocompleteOption) => void-
onSearchCallback lorsque la valeur d’entrée change (pour le filtrage asynchrone)(value: string) => void-
optionsTableau d’options à afficherstring[] | AutocompleteOption[]-
placeholderTexte de placeholder de l’entréestring"Type to search..."
disabledDésactiver l’autocompletebooleanfalse
sizeTaille de l’entrée'xs' | 'sm' | 'md' | 'lg' | 'xl''md'
colorVariante de couleur de l’entrée'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'-
statusStatut de validation (définit aria-invalid)'error' | 'warning'-
allowCustomValueAutoriser l’utilisateur à saisir des valeurs personnalisées non présentes dans les optionsbooleantrue
filterOptionFonction de filtre personnalisée(option: AutocompleteOption, inputValue: string) => boolean-
notFoundContentContenu à afficher lorsqu’aucune option ne correspondReact.ReactNode"No results found"
allowClearAfficher le bouton d’effacement lorsque l’entrée a une valeurboolean | { clearIcon?: ReactNode }false
onClearCallback lorsque le bouton d’effacement est cliqué() => void-
openÉtat d’ouverture contrôlé du menu déroulantboolean-
defaultOpenÉtat d’ouverture par défaut (non contrôlé)booleanfalse
onOpenChangeCallback lorsque l’état d’ouverture change(open: boolean) => void-
defaultActiveFirstOptionActiver la première option par défaut lors du filtragebooleantrue
classNameClasses CSS supplémentairesstring-
data-testidID de test pour les testsstring-
PropriétéDescriptionTypeDéfaut
valueLa valeur de l’optionstring-
labelLe texte d’affichage de l’optionstring-
disabledSi l’option est désactivéeboolean-
data-testidID de test pour les testsstring-
  • Haut / Bas - Naviguer parmi les options
  • Entrée - Sélectionner l’option en surbrillance
  • Échap - Fermer le menu déroulant et retirer le focus de l’entrée
  • Utilise role="combobox" avec les attributs ARIA appropriés
  • Le menu déroulant utilise role="listbox" avec des éléments role="option"
  • aria-expanded indique l’état d’ouverture du menu déroulant
  • aria-activedescendant suit l’option en surbrillance
  • aria-selected indique l’option actuellement en surbrillance
  • Utiliser status="error" pour définir automatiquement aria-invalid
  • Les options désactivées utilisent aria-disabled
  • Le bouton d’effacement a un aria-label pour les lecteurs d’écran