Entrada controlada com lista de sugestões
Crie a base: uma entrada controlada que exiba uma lista suspensa de sugestões filtradas abaixo dela.
Entrada controlada com lista de sugestões é uma aula grátis de React Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.
Visão geral da estrutura do componente
Um componente de preenchimento automático tem duas partes principais: um campo de texto controlado e uma lista suspensa de sugestões. O campo fica no fluxo normal do documento, e a lista suspensa é posicionada de forma absoluta diretamente abaixo dele. Juntos, eles funcionam como um único componente interativo, embora sejam elementos DOM separados.
Variáveis de estado necessárias
Você precisa de quatro variáveis de estado: inputValue (cadeia de caracteres — o que foi digitado), suggestions (lista — itens correspondentes atuais), isOpen (booleano — se a lista suspensa está visível) e selectedIndex (número — qual sugestão está destacada para a navegação pelo teclado; começa em -1 quando nenhuma está selecionada).
Controlando o campo de entrada
Torne o campo de entrada totalmente controlado: value={inputValue} e onChange={e => setInputValue(e.target.value)}. Isso dá ao React controle total sobre o texto exibido. Cada pressionamento de tecla atualiza o estado, o que aciona uma nova renderização com o novo valor. Nunca use um campo de entrada não controlado para preenchimento automático — você precisa ler e definir o valor programaticamente.
Filtrando uma lista estática
Quando as sugestões vêm de uma lista local, filtre a cada renderização com base em inputValue: compare cada item usando item.toLowerCase().includes(inputValue.toLowerCase()). Você pode calcular isso com useMemo se a lista for grande, para evitar recalcular a cada nova renderização. Para listas pequenas, a filtragem direta é suficiente.
Exibindo e ocultando a lista suspensa
Abra a lista suspensa quando inputValue.length > 0 e suggestions.length > 0. Feche-a quando o campo perder o foco, com um pequeno atraso para permitir que os cliques nas sugestões sejam registrados primeiro, quando uma sugestão for selecionada ou quando a tecla Escape for pressionada. Defina isOpen de acordo para controlar a renderização condicional.
Tratando a perda de foco com um atraso
O evento onBlur é acionado quando o campo de entrada perde o foco, o que acontece quando o usuário clica em uma sugestão. Se você fechar a lista suspensa imediatamente ao perder o foco, o clique na sugestão nunca será registrado, porque a lista desaparece antes de o clique ser acionado. Use setTimeout(() => setIsOpen(false), 150) para dar tempo de o clique ser registrado.
Estilizando a lista suspensa
Posicione a lista suspensa com position: absolute para que ela se sobreponha ao conteúdo abaixo do campo em vez de empurrá-lo para baixo. Defina um z-index alto (100 ou mais) para que ela apareça acima dos outros conteúdos. Defina uma max-height com overflow-y: auto para impedir que a lista fique alta demais quando houver muitos resultados.
Tornando as sugestões clicáveis
Cada item de sugestão deve ter um manipulador onClick: onClick={() => { setInputValue(suggestion); setIsOpen(false); }}. Isso define o campo de entrada como a sugestão selecionada e fecha a lista suspensa. A seleção parece imediata e natural, correspondendo ao comportamento esperado pelos usuários em campos de preenchimento automático.
Impedindo a perda de foco antes do clique
Uma alternativa ao tempo limite de perda de foco é usar onMouseDown={e => e.preventDefault()} em cada item de sugestão. Isso impede que o pressionamento do botão do mouse roube o foco do campo de entrada, portanto o evento de perda de foco não é acionado ao clicar em uma sugestão. O campo mantém o foco, e o manipulador de clique é executado corretamente.
Visão geral da interação pelo teclado
Um bom preenchimento automático deve ser navegável pelo teclado. O usuário deve poder pressionar ArrowDown para destacar a primeira sugestão, continuar pressionando essa tecla para avançar pela lista, pressionar Enter para selecionar e pressionar Escape para fechar sem selecionar. Isso é implementado tratando onKeyDown no elemento de entrada.
Redefinindo selectedIndex ao alterar o campo
Sempre que o usuário digitar e inputValue mudar, redefina selectedIndex para -1. Isso remove qualquer seleção anterior pelo teclado, para que o novo conjunto de sugestões filtradas comece sem nenhum item destacado. Um índice de seleção desatualizado apontando para um item diferente depois que a lista muda é confuso e incorreto.
Ordem dos eventos Blur e MouseDown
Por que usar onMouseDown com e.preventDefault() nos itens de sugestão em vez de depender de um tempo limite de perda de foco?
Recapitulação da lição: campo controlado com sugestões
Um componente de preenchimento automático precisa de quatro variáveis de estado: inputValue, sugestões, isOpen e selectedIndex. Use um campo de entrada controlado, filtre as sugestões com base no campo de entrada e gerencie a visibilidade da lista suspensa por meio de isOpen. Trate a condição de corrida entre perda de foco e clique usando um tempo limite ou preventDefault em onMouseDown. Redefina selectedIndex sempre que o campo de entrada mudar.
Perguntas Frequentes
A aula “Entrada controlada com lista de sugestões” é grátis?
Sim — o texto completo de “Entrada controlada com lista de sugestões” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.
O que vou aprender em “Entrada controlada com lista de sugestões”?
Crie a base: uma entrada controlada que exiba uma lista suspensa de sugestões filtradas abaixo dela. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar React Academy?
Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Entrada controlada com lista de sugestões”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de React Academy?
Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Entrada controlada com lista de sugestões
- Navegação pelo teclado em listas de sugestões
- Sugestões assíncronas com debounce
- Acessibilidade para componentes de preenchimento automático