//
Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Os blocos de construção essenciais que todo aprendiz básico de React deve conhecer antes de mergulhar em padrões avançados.
className em vez de class, htmlFor em vez de for, e camelCase para atributos de evento como onClick.{} incorporam expressões: Use {variavel} dentro do JSX para exibir valores dinâmicos -- você pode colocar qualquer expressão JavaScript dentro, mas não declarações como if ou for.useState(valorInicial) para obter um par [valor, setValor] -- atualizar o estado com o setter aciona uma re-renderização.onClick={handleClick} -- passe a referência da função, nunca a chame com parênteses como onClick={handleClick()}..map(), cada elemento precisa de uma key única para que o React possa rastrear eficientemente adições, remoções e reordenações.{condicao ? <A /> : <B />} ou {condicao && <A />} já que você não pode usar instruções if diretamente dentro do JSX.value={estado} e onChange={e => setEstado(e.target.value)} juntos -- definir apenas value torna o input somente leitura.children -- é assim que você constrói componentes wrapper e de layout.useEffect(() => { ... }, [deps]) para coisas que acontecem fora da renderização, como chamadas de API, timers ou assinaturas.[] significa "executar uma vez ao montar" -- listar variáveis significa "re-executar quando estas mudarem" -- omiti-lo significa "executar após cada renderização".export default ou export para tornar um componente disponível, então import ele em outro arquivo para usá-lo -- o alias @/ aponta para a raiz do seu projeto.<>...</> (Fragment) quando você não precisa de um <div> extra -- isso mantém sua marcação HTML renderizada limpa.style={{ color: "red", fontSize: "16px" }} com propriedades camelCase -- mas na prática, use um framework CSS como Tailwind em vez disso.useState separado.interface ou type e use arquivos .tsx -- o compilador sinalizará props ausentes, tipos errados e erros de digitação instantaneamente.Um resumo condensado das 25 melhores práticas mais importantes extraídas de todas as páginas desta seção.
function Pai() { function Filho() {} /* ruim - Filho é remontado a cada renderização */ }.props.itens.push(x)) muta silenciosamente os dados do pai e quebra o modelo de renderização do React; copie para novos arrays ou objetos antes de modificar e deixe o pai ser o dono do estado.React.ComponentPropsWithoutRef<"button"> para que cada atributo nativo permaneça sincronizado com a API DOM; re-declarar props manualmente se torna obsoleto no momento em que a especificação DOM muda.interface para Props: interface fornece melhores mensagens de erro e suporta a fusão de declarações, então use-a para formas de props de componentes; reserve type para uniões, tipos mapeados e outras transformações que interfaces não podem expressar.{contagem && <Badge />} renderiza a string literal "0" quando contagem é 0 porque 0 é falsy, mas ainda renderizável; use contagem > 0 && <Badge /> ou um ternário para evitar o infame bug do "0".{ status: "sucesso"; dados } | { status: "erro"; erro } para que o TypeScript restrinja o tipo dentro de cada branch; isso elimina o ruído do encadeamento opcional e torna as branches inalcançáveis óbvias.<Spinner /> → <DataTable />, ou <input> ↔ <textarea>) desmonta a subárvore antiga e apaga seu estado; mantenha o mesmo tipo e alterne props quando quiser que o estado persista.onClick={handleClick} anexa a função; onClick={handleClick()} a chama durante a renderização e usa o valor de retorno como manipulador, o que raramente é o que você quer -- envolva em uma arrow function quando precisar injetar argumentos: onClick={() => handleClick(id)}.onChange do React mapeia para o evento nativo input, não para o nativo change, então ele dispara a cada tecla em vez de ao perder o foco -- use onBlur se você realmente quiser a semântica de "confirmar ao perder o foco".e.target é o elemento de onde o evento se originou (que pode ser um filho), enquanto e.currentTarget é o elemento ao qual o manipulador está anexado; leia atributos que você controla de currentTarget para evitar surpresas ao clicar em elementos aninhados.{ passive: false } ou eventos em nível de window/document; para listeners da tecla Escape, monitores de scroll ou touchmove que precisam de preventDefault, use useEffect + addEventListener em um ref e retorne uma limpeza.value sem um onChange correspondente torna o input somente leitura porque o React fixa o valor do DOM ao estado; pareie os dois -- <input value={nome} onChange={e => setName(e.target.value)} /> -- ou mude para defaultValue para um input não controlado.checked/defaultChecked, não value/defaultValue; misturá-los silenciosamente faz a coisa errada, já que value em um checkbox é o token submetido, não o estado marcado: <input type="checkbox" checked={ligado} onChange={e => setLigado(e.target.checked)} />.useFormStatus() só retorna informações precisas sobre o status de pendência quando chamado de dentro de um descendente do <form>; chamá-lo no mesmo componente que renderiza o formulário retorna padrões obsoletos sem erro, então extraia o botão de submit para seu próprio componente.e.target.value é sempre uma string -- mesmo para <input type="number"> -- então envolva-o com Number(...) ou parseInt(...) antes de usá-lo em cálculos ou para armazenar estado tipado: onChange={e => setIdade(Number(e.target.value))}.React.createElement, então o atributo class do HTML é className, for é htmlFor, e estilos recebem um objeto camelCase; usar os nomes HTML compila, mas avisa e pode silenciosamente remover estilos em ambientes rigorosos.{usuario} lança "Objetos não são válidos como filhos React"; renderize um campo específico como {usuario.nome} ou JSON.stringify(usuario) para saída de depuração, e lembre-se que 0 renderiza como texto, mas null/false/undefined não renderizam nada.children como React.ReactNode (que cobre JSX, strings, números, arrays, null) e reserve React.JSX.Element para tipos de retorno que sempre retornam um único elemento JSX.key de uma lista deve ser única entre seus irmãos (não globalmente), e deve ser estável entre renderizações -- use item.id, não Math.random() ou Date.now(), ou o React remontará cada linha e destruirá seu estado.index como key em listas que reordenam, filtram ou inserem faz com que o React reutilize os nós DOM errados, produzindo valores de input obsoletos e foco quebrado; chaves de índice só são seguras para listas verdadeiramente estáticas.key em um componente é a maneira canônica de resetar todo o seu estado interno -- <PlayerProfile key={idDoJogadorAtual} /> deliberadamente remonta quando o jogador muda, o que é um recurso, não um hack.<>...</> não aceita uma prop key; ao mapear fragments, importe Fragment e use <Fragment key={...}>...</Fragment> para evitar avisos de chave duplicada ou renderizações sem chave.ref.current não re-renderiza o componente -- esse é o objetivo; use useRef quando a UI não depende do valor (IDs de timer, observadores, cache de último valor) e useState quando depende.forwardRef é depreciado; apenas digite ref como uma prop comum com React.Ref<HTMLInputElement> e desestruture-a junto com as outras -- e lembre-se que {...props} agora também espalha ref, então retire-a explicitamente ao passar adiante.useEffect, então conecte observadores como ref={node => { if (!node) return; const obs = new ResizeObserver(...); obs.observe(node); return () => obs.disconnect(); }} em vez da antiga dança de verificação de nulo.Revisado por Chris St. John·Última atualização: 16 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥