Back

React Select na Prática: Exemplos Reais, Personalização e Armadilhas Comuns

React Select na Prática: Exemplos Reais, Personalização e Armadilhas Comuns

O React Select é um componente de entrada de seleção poderoso e flexível, amplamente favorecido em aplicações React por sua capacidade de personalização e facilidade de uso. A implementação básica é simples, mas o uso no mundo real rapidamente revela desafios. Este guia aborda insights práticos e armadilhas comuns para garantir um uso tranquilo.

Principais Aprendizados

  • O React Select é altamente personalizável usando props integradas e opções de estilo.
  • Cenários do mundo real exigem o tratamento de carregamento assíncrono, grandes conjuntos de dados e integração com bibliotecas de formulários.
  • Evite armadilhas comuns como renderizações excessivas, conflitos de estilo e problemas de acessibilidade.

Instalação Rápida

Instale o React Select usando npm ou yarn:

npm install react-select
# ou
yarn add react-select

Uso Básico: Exemplo Mínimo Viável

Aqui está o exemplo mais simples para entender rapidamente o React Select:

import Select from 'react-select';

const options = [
  { value: 'apple', label: 'Apple' },
  { value: 'banana', label: 'Banana' },
  { value: 'cherry', label: 'Cherry' },
];

const MyComponent = () => (
  <Select options={options} />
);

Personalização Prática

Estilizando o React Select

Personalize estilos usando a prop styles:

<Select
  options={options}
  styles={{
    control: (baseStyles, state) => ({
      ...baseStyles,
      borderColor: state.isFocused ? 'blue' : 'gray',
      boxShadow: 'none',
      '&:hover': { borderColor: 'blue' },
    }),
    option: (baseStyles, state) => ({
      ...baseStyles,
      backgroundColor: state.isSelected ? 'blue' : 'white',
      color: state.isSelected ? 'white' : 'black',
      '&:hover': { backgroundColor: 'lightgray' },
    }),
  }}
/>

Lidando com Opções Assíncronas

Use AsyncSelect para opções carregadas via API:

import AsyncSelect from 'react-select/async';

const loadOptions = (inputValue) =>
  fetch(`https://api.example.com/fruits?search=${inputValue}`)
    .then(res => res.json())
    .then(data => data.map(item => ({ label: item.name, value: item.id })));

<AsyncSelect cacheOptions loadOptions={loadOptions} />;

Casos de Uso do Mundo Real

Integração com React Hook Form

Use o React Select efetivamente com formulários:

import { Controller, useForm } from 'react-hook-form';

const MyForm = () => {
  const { control, handleSubmit } = useForm();

  return (
    <form onSubmit={handleSubmit(data => console.log(data))}>
      <Controller
        name="fruit"
        control={control}
        render={({ field }) => (
          <Select {...field} options={options} />
        )}
      />
      <button type="submit">Submit</button>
    </form>
  );
};

Multiseleção com Etiquetagem Personalizada

<Select
  options={options}
  isMulti
  closeMenuOnSelect={false}
  hideSelectedOptions={false}
/>

Melhores Práticas de Acessibilidade

Garanta que os componentes de seleção sejam acessíveis:

  • Suporte à navegação por teclado (setas para cima/baixo, enter, escape).
  • Rotule claramente os componentes para leitores de tela:
<label htmlFor="fruit-select">Escolha uma Fruta</label>
<Select inputId="fruit-select" options={options} />

Solução de Problemas e Erros Comuns

Renderizações Excessivas

Use memorização para evitar renderizações desnecessárias:

const options = useMemo(() => [
  { value: 'apple', label: 'Apple' },
], []);

Conflitos de Estilo

Use CSS-in-JS ou estilos com escopo para gerenciar conflitos de estilo efetivamente.

Problemas de Integração com Estado de Formulário

Use o Controller do React Hook Form para lidar com o estado adequadamente.

Dicas Rápidas de Desempenho

  • Virtualize grandes conjuntos de dados usando bibliotecas como react-windowed-select.
  • Aplique debounce em entradas de pesquisa assíncronas para otimizar o desempenho.

Quando Não Usar o React Select

O React Select não é ideal para:

  • Dropdowns simples (recomenda-se select nativo ou bibliotecas mais simples).
  • Conjuntos de dados extremamente grandes sem virtualização.

Conclusão

Usar o React Select efetivamente requer compreensão de personalização, acessibilidade e considerações de desempenho. Ao abordar cenários práticos e armadilhas, você pode garantir que suas implementações do React Select sejam robustas e amigáveis ao usuário.

Perguntas Frequentes

Você pode limpar a seleção usando uma referência: `<Select ref={ref => ref.clearValue()} />`.

Passe a(s) opção(ões) selecionada(s) como prop `value` para o React Select.

Use a prop `styles` ou bibliotecas CSS-in-JS como Emotion ou Styled Components para personalização detalhada.

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers