Melhores Práticas de Padrões React
Um resumo condensado das 25 melhores práticas mais importantes, extraídas de cada página desta seção.
Busque em todas as páginas da documentação
Um resumo condensado das 25 melhores práticas mais importantes, extraídas de cada página desta seção.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
children: Sobrecarregar children para layouts multi-região perde o controle de posicionamento; exponha props nomeadas ReactNode - ({ header, sidebar, footer }: { header: ReactNode; sidebar: ReactNode; footer: ReactNode }) - para que os consumidores possam preencher cada slot independentemente e você mantenha o TypeScript do lado deles.ReactNode, ReactElement ou ComponentType: ReactNode aceita strings/null/arrays (melhor para slots e children), ReactElement restringe a um único elemento JSX, e ComponentType<P> é um componente que você pode instanciar - escolha intencionalmente porque eles tipam diferentes estilos de composição.Root.Item, Root.Trigger e Root.Content funcionem em qualquer profundidade JSX - proteja o hook consumidor com um erro lançado quando usado fora da raiz em vez de retornar um null silencioso."use client": Componentes compostos dependem de createContext e useState, então o arquivo raiz deve ser um Client Component no Next.js - e use contexto de dois níveis (AccordionContext + ItemContext por item) para escopar a identidade a cada item.dispatch do useReducer já é estável no React e não precisa de memoização extra.value de contexto em cada renderização pai derrota a memoização e re-renderiza todos os consumidores; envolva o valor em useMemo com chave no estado real, ou divida contextos para que consumidores apenas de atualizadores sejam imunes.value !== undefined e recorrer ao estado interno - const [inner, setInner] = useState(defaultValue); const val = value !== undefined ? value : inner - envolva a decisão em um hook reutilizável useControllableState e nunca mude os modos após a montagem.onChange que define o estado congela o input porque o valor do DOM fica atrás do usuário; use debounce para efeitos colaterais (busca, autossalvamento) enquanto sempre atualiza o estado controlado de forma síncrona.getDerivedStateFromError: Implemente getDerivedStateFromError (derivação de estado pura na fase de renderização) para a troca de fallback e componentDidCatch (pós-commit) para logging no Sentry; não há equivalente em hooks, então use uma classe ou react-error-boundary.resetKeys + key: Use resetKeys para que o boundary se recupere automaticamente quando um parâmetro de rota muda, e coloque uma key nos filhos do boundary para que limpar hasError force uma remontagem - simplesmente resetar o estado deixa a subárvore em seu estado corrompido.try/catch explícitos, e no Next.js confie na convenção error.tsx no nível da rota com error.digest para erros de servidor.withAuth(Component) dentro do corpo de outro componente cria um tipo de componente totalmente novo a cada renderização e destrói o estado; aplique HOCs uma vez no escopo do módulo - const ProtectedPage = withAuth(DashboardPage) - e sempre defina um displayName significativo.React.forwardRef internamente e copie estáticas com hoist-non-react-statics - caso contrário, os consumidores perdem handles imperativos e constantes anexadas.memo/useMemo/useCallback prematuros adicionam sobrecarga de comparação que pode tornar componentes rápidos lentos; use o React DevTools Profiler para identificar pontos críticos reais e lembre-se que onClick={() => …} ou style={{…}} inline derrotam o memo por referências novas.useTransition Possui, useDeferredValue Recebe: Use useTransition quando você possui o setter de estado e quer marcar a atualização como não urgente; use useDeferredValue para atrasar um valor que você recebe como prop, e compare-o com o valor atual para mostrar um sutil indicador de obsolescência.memo - recorra a react-virtual/react-window ou CSS content-visibility: auto, e mantenha keys estáveis (IDs, não índices) para que as linhas não sejam remontadas ao rolar.createPortal Mantém a Árvore React: Eventos borbulham através da árvore React (não da árvore DOM) através de portais, então cliques dentro de um modal ainda atingem ancestrais React - chame stopPropagation quando precisar de uma quebra limpa, e capture o foco mais salve/restaure-o para modais reais.document.body causa falha na renderização do servidor, então proteja o portal com uma flag mounted definida por useEffect - const [mounted, setMounted] = useState(false); useEffect(() => setMounted(true), []) - ou marque o componente como "use client" no Next.js, e crie um nó container dedicado em vez de acumular divs vazias em body.children={(state) => <X />} inline cria uma nova referência de função a cada renderização e quebra React.memo no pai; promova a função ou aceite que o memo não se aplicará aqui, e lembre-se que hooks não podem ser chamados dentro de uma função render-prop.<button {...triggerProps}>Abrir</button> <div {...contentProps}>…</div> - os consumidores não podem esquecer a configuração de acessibilidade porque ela vem com a coleção.isLoading/isError/hasData por uma única união marcada status para que combinações impossíveis sejam irrepresentáveis; cada estado carrega apenas os dados válidos para aquele estado.return state para eventos desconhecidos para que transições não tratadas não produzam undefined.use(promise) trata uma nova referência como uma nova requisição pendente; promova a criação da promessa para um pai, um cache ou um manipulador de eventos.useTransition ao substituir UI impulsionada por Suspense para que fetches rápidos não mostrem um esqueleto, e aninhe boundaries para que conteúdo secundário flua após o shell crítico.Revisado por Chris St. John·Última atualização: 16 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥