Boas Práticas do React 19
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 🔥
@types/react e @types/react-dom devem ser atualizados na mesma instalação para a linha v19; versões incompatíveis produzem erros de tipo confusos (por exemplo, ref faltando em ComponentProps) que parecem bugs do React.<Context.Provider value={…}> está depreciado - renderize <ThemeContext value={theme}>…</ThemeContext> diretamente; a forma antiga .Provider ainda funciona, mas emite um aviso e está destinada à remoção.await diretamente no corpo - Componentes de Cliente não podem ser async, não podem usar useState/useEffect e não têm acesso a window, document ou localStorage.children ou props JSX nomeadas de um componente pai de Servidor.Date, Map, Set, FormData, arrays tipados, Promises não aguardadas e Server Actions - mas nunca funções regulares, instâncias de classe ou nós DOM."use server" converte funções async individuais em endpoints RPC, então evite colocá-lo no topo de um arquivo de componente esperando que todas as exportações se tornem actions - isso quebra as exportações do componente em vez disso.return { success: true, data } ou return { success: false, error: "Inválido" } - e reserve throw para falhas genuinamente inesperadas capturadas por error.tsx."use server" inline são serializadas como campos de formulário ocultos criptografados em cada renderização, então extraia closures pesadas para arquivos de action de nível superior quando o estado capturado ficar grande.useFormStatus() reflete apenas o <form> ancestral mais próximo, então chamá-lo no mesmo componente que renderiza o formulário sempre retorna pending: false - mova o botão de leitura de status para um filho do formulário.return { ...prevState, error: "Email inválido" } - e lembre-se de importá-lo de "react", não de "react-dom".use() causa um loop infinito de Suspense; eleve a criação da promise para um Componente de Servidor pai, um cache estável ou uma prop para que a referência seja estável entre as renderizações.use(promise) requer um ancestral Suspense para mostrar o estado de carregamento e um error boundary para capturar rejeições - sem ambos, o aplicativo lança uma exceção ou fica silenciosamente travado em promises pendentes.use() é legal dentro de if, loops e retornos antecipados - if (shouldLoad) { const data = use(promise) } - aproveite isso para leituras de contexto condicionais e desempacotamento de promises com guarda em vez de forçar formas antigas de useContext/useEffect.addOptimistic silenciosamente não faz nada a menos que seja invocado dentro de uma action de formulário, um manipulador de Server Action ou uma startTransition explícita; envolva chamadas de manipulador de eventos: startTransition(() => addOptimistic(newItem)) para que a atualização otimista realmente se aplique.updateFn passada para useOptimistic deve ser pura e produzir um novo valor - mutar o estado ou referenciar escopo com efeitos colaterais quebra o rollback automático em caso de falha.useOptimistic com useActionState para que os erros ainda sejam renderizados para o usuário após o rollback.ref como uma prop comum, então {...props} acidentalmente encaminha ref junto com todo o resto - desestruture-o explicitamente: ({ ref, ...props }) => <input ref={ref} {...props} />, especialmente quando o componente é um pass-through.useEffect); retornar qualquer outra coisa (não função, não undefined) aciona um aviso de desenvolvimento, então retorne uma limpeza ou não retorne nada.<link rel="stylesheet" precedence="…"> opta pela dedupicação, ordenação e Suspense-until-loaded do React - sem precedence, a folha de estilo não é gerenciada e você pode ter FOUC (Flash of Unstyled Content) ou folhas duplicadas.<title> para <head>, mas apenas o último renderizado vence, então espalhar títulos entre componentes produz resultados dependentes da ordem; escolha um único local <title> (ou use a API de metadados do framework) e mantenha-o.preload quando você só quer os bytes no cache e preinit quando você também quer que scripts sejam executados ou folhas de estilo sejam aplicadas; preinit executa scripts imediatamente e falhará se eles dependerem de DOM que ainda não foi renderizado.crossOrigin: "anonymous" em pré-carregamentos de fontes, mesmo para requisições same-origin - preload("/font.woff2", { as: "font", crossOrigin: "anonymous" }) - sem isso o navegador baixa a fonte duas vezes e a dica de pré-carregamento é desperdiçada.compilationMode: "annotation" e a diretiva "use memo" para uma implantação gradual, e use "use no memo" para excluir funções específicas.Revisado por Chris St. John·Última atualização: 16 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥