12k
All articles

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

Componentes React Select com opções assíncronas, estilos customizados e integração ao React Hook Form, evitando re-renders e problemas de acessibilidade.

OpenReplay Team
OpenReplay Team
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

Como limpar o React Select programaticamente?

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

Como pré-selecionar opções no React Select?

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

Como estilizo os componentes do 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

We use cookies to improve your experience. By using our site, you accept cookies.