Autocomplete
Base
O Autocomplete
é um componente para seleção de valores dentre uma lista de opções que podem ser filtradas com base em um termo digitado.
Modos de apresentação
O Autocomplete
se apresenta visualmente como um select (padrão) ou como um input, a mudança entre um destes dois modos pode ser feita através da propriedade kind
.
Opções
A lista de opções de um Autocomplete
pode ser gerada de dois modos:
- Por meio da propriedade
options
, através de um array de objetos - Por meio do subcomponente
Autocomplete.Option
Através da propriedade options
Utilize a propriedade options
para definir a lista de opções de um componente Autocomplete
. A propriedade options
deve conter um array de objetos e, de modo geral, cada um desses objetos deve possuir os atributos label
e value
, representando respectivamente o texto e o valor da opção na lista.
Utilizando um array de opções sem os atributos label
e value
Utilize as propriedades getOptionLabel
e getOptionValue
quando os objetos do array não possuirem um atributo label
ou value
.
Através do subcomponente Autocomplete.Option
Também é possível definir a lista de opções passando uma série de subcomponentes Autocomplete.Option
como filhos do componente Autocomplete
.
O subcomponente Autocomplete.Option
possui uma série de propriedades que permitem customizar desde texto auxiliar, até ícone (consulte a documentação da API para mais detalhes). Contudo, estes elementos visuais não estão disponíveis para as opções geradas através da propriedade options
, que só permite a customização do texto (label
).
- O
Autocomplete
leva em consideração apenas a propriedadelabel
doAutocomplete.Option
para filtrar as opções da listagem - As propriedades
getOptionLabel
egetOptionValue
não tem efeito quando as opções são construídas através do subcomponenteAutocomplete.Option
Seleção multipla
Por padrão o usuário pode apenas selecionar uma opção entre as disponíveis na listagem do Autocomplete
, contudo, através da propriedade multiple
é possível habilitar a escolha de múltiplas opções.
Com o subcomponente Autocomplete.Option
A propriedade multiple
do Autocomplete
também tem o mesmo efeito para uma listagem de opções geradas através do subcomponente Autocomplete.Option
.
Desabilitando opções
Adicione a propriedade disabled
no subcomponente Autocomplete.Option
para desabilitar uma opção específica.
- Não é possível navegar ou selecionar opções desabilitadas
- Você só consegue desabilitar opções através do subcomponente
Autocomplete.Option
, o mesmo não pode ser feito através da propriedadeoptions
doAutocomplete
Mostrando uma mensagem quando não houver opções
Use a propriedade renderNoOption
para adicionar uma mensagem quando não houver opções para serem exibidas.
Valor inicial e controle de estado
Utilize a propriedade defaultValue
para prover um valor inicial ao componente Autocomplete
não controlado, ou utilize a propriedade value
para gerenciar o valor do Autocomplete
controlado.
A opção selecionada (ou opções selecionadas, no caso de um Autocomplete
com seleção múltipla) será definida através da igualdade estrita entre os atributos label
e value
das opções e do valor passado para a propriedade defaultValue
ou value
.
Tanto a propriedade defaultValue
quanto value
estão sujeitos aos efeitos das propriedades getOptionLabel
e getOptionvalue
.
Não controlado
É possível utilizar o parâmetro defaultValue
para definir o valor inicial do Autocomplete
.
Controlado
Você deve criar um estado para gerenciar o valor através da propriedade value
ao utilizar o Autocomplete
controlado.
Requisições assíncronas
É possível carregar assíncronamente as opções do Autocomplete
de dois modos distintos:
- Ao abrir o
Autocomplete
- Com base no texto digitado enquanto se filtra
Em ambos os modos é importante assinalar visualmente que o componente está carregando as opções através da propriedade loading
.
Carregando as opções ao abrir o Autocomplete
Utilize o evento onOpen
para buscar os dados necessários para montar dinamicamente a lista de opções.
Por questões de performance e usabilidade, não é ideal buscar os dados para montar a lista de opções toda vez que o usuário abrir o Autocomplete
. Pense em políticas de cache e retentativas adequadas para o seu cenário.
Carregando as opções ao filtrar
Utilize o evento onInputChange
para buscar os dados necessários para montar dinamicamente a lista de opções enquanto o usuário digita no filtro do Autocomplete
.
Por questões de performance e usabilidade, não é ideal buscar os dados para montar a lista de opções toda vez que um novo caractere é digitado no filtro do Autocomplete
. Pense em estratégias de otimização como throttle e debounce adequadas ao seu cenário.
Separadores
Utilize os subcomponentes Autocomplete.Title
e Autocomplete.Divider
para agrupar ou separar opções.
O uso de separadores não está disponível para geração de opções através da propriedade options
do Autocomplete
.
Agrupador com texto
Utilize o subcomponente Autocomplete.Title
para agrupar opções.
O filtro do Autocomplete
não leva em consideração o texto do subcomponente Autocomplete.Title
.
Divisor com linha
Utilize o subcomponente Autocomplete.Divider
para separar opções.
Incluindo rodapé
Utilize a propriedade renderFooter
para renderizar um rodapé após a lista de opções. Esta propriedade aceita um componente com as seguintes propriedades:
inputValue
: O valor atual do inputhasOption
: Indica se há opções sendo exibidasclose
: Função para fechar oAutocomplete
selectedOption
: Opção selecionada, presente quando oAutocomplete
for de seleção únicaselectedOptions
: Lista com as opções selecionadas, presente quando oAutocomplete
for de múltipla seleçãoclearInputValue
: Função para limpar o valor do input
Desabilitado
Utilize a propriedade disabled
do Autocomplete
para desabilitar o componente como um todo.
Com o componente Tag
Com texto de apoio
Padrão
Utilize o subcomponente Form.Feedback
para incluir textos de apoio ao Autocomplete
.
Utilize o atributo aria-describedby
para vincular o componente Autocomplete
ao texto de apoio.
Sucesso
A mensagem de sucesso, assim como seu estilo, deve ser aplicada somente quando o campo precisar de alguma validação. Os estados de sucesso e erro não têm relação direta entre si.
Erro
Se o Autocomplete
for preenchido incorretamente, ou seus critérios não forem atendidos, deve ser exibida uma mensagem de erro como validação.
Após correção do erro, o estado do campo deve voltar para o estilo padrão.
Integração com o Form.Control
Assim como em outros componentes de formulário, o componente Autocomplete
está integrado com o subcomponente Form.Control
e recebe as propriedades error
e success
automaticamente por meio dessa integração.
React Hook Form
Use o componente Autocomplete
junto com o React Hook Form. Para isso, instale essa dependência no projeto:
yarn add react-hook-form
import React, { useState } from 'react';
import { useForm, Controller } from 'react-hook-form';
import {
Form,
Autocomplete,
Text,
Button
} from '@resultadosdigitais/tangram-components';
export default function WithReactHookForm() {
const [submitted, onSubmit] = useState(false);
const currencies = [
{ value: 'BRL', label: 'Real' },
{ value: 'USD', label: 'Dolar' },
{ value: 'EUR', label: 'Euro' }
];
const {
control,
setValue,
handleSubmit,
formState: { errors }
} = useForm();
const CURRENCY = 'currency';
const handleFieldChange = field => (_, option) => {
field.onChange(option);
};
const handleClear = () => {
setValue(CURRENCY, null);
};
return (
<>
{submitted && (
<Text>
<strong>Submitted: </strong>
<code>{JSON.stringify(submitted)}</code>
</Text>
)}
<Form onSubmit={handleSubmit(onSubmit)}>
<Form.Label htmlFor={CURRENCY}>Currency</Form.Label>
<Form.Control error={Boolean(errors.currency)}>
<Controller
control={control}
name={CURRENCY}
defaultValue={null}
render={({ field }) => (
<Autocomplete
id={CURRENCY}
name={CURRENCY}
options={currencies}
placeholder="Select currency"
renderNoOption="No currency found"
aria-describedby={`${CURRENCY}-feedback`}
onChange={handleFieldChange(field)}
onClear={handleClear}
/>
)}
rules={{ required: true }}
/>
{errors.currency && (
<Form.Feedback id={`${CURRENCY}-feedback`}>
This field is required
</Form.Feedback>
)}
</Form.Control>
<Button type="submit">Submit</Button>
</Form>
</>
);
}
Veja e teste o exemplo completo abaixo: