Pular para o conteúdo
Guia de execução · menu Design

React: os cinco padrões de componente e o lugar de cada estado

Quem encomenda telas a um agente de IA recebe React em quantidade e precisa saber revisar o que chega; revisar em 2026 exige saber o que mudou. O React estável é o 19.2, de outubro de 2025; o React Compiler chegou à versão 1.0 estável e memoiza sozinho o que antes se escrevia à mão; o Next.js 16 tornou o Turbopack padrão e renomeou o middleware; e um release de segurança em julho de 2026 corrigiu nove vulnerabilidades, duas delas em Server Actions. Aqui está o que a revisão precisa: os cinco padrões de componente com o sinal de reprovação de cada um, a pergunta de trinta segundos sobre onde mora cada estado, o critério oficial para dispensar um useEffect, dado de servidor em camada de cache, formulário sem redesenho a cada tecla, filtro e busca na URL, e a versão mínima que o time deve cobrar de qualquer entrega. A mesma matéria está em aula de vídeo e podcast logo abaixo.

Guia do menu Design do portal, construído sobre pesquisa de fontes primárias verificada em 18/08/2026 (documentação e blog oficiais do React e do Next.js, registros do npm, State of React 2025) e sobre os capítulos de React do curso Frontends com Vibecoding, de Alexandre Caramaschi. Ele compõe o menu com os guias de ícones, ilustrações, animação e geração de imagens, de menus, abas e paginação, de diagramas e de Tailwind e CSS moderno.

A aula, em vídeo e em podcast

O conteúdo deste guia virou uma aula gerada no NotebookLM a partir do dossiê de pesquisa, servida nos arquivos originais, sem recompressão. O vídeo apresenta o panorama em minutos; o podcast aprofunda a conversa para ouvir no deslocamento. Cada player traz download, compartilhamento e a transcrição completa para ler ou copiar.

Aula em vídeo: React em 2026Panorama do guia: componentes, estado e dados · 10 min
Podcast: React em 2026A conversa aprofundada sobre as mesmas decisões · 33 min

Arquivos originais: vídeo em MP4 · podcast em M4A · legenda do vídeo · transcrição do vídeo · transcrição do podcast

O React de 2026, em quatro fatos

O curso que origina este guia abre com um diagnóstico que segue válido: "o agente escreve muito bem o React, o Tailwind e o CSS de dois anos atrás. Ele acerta a estrutura, erra a atualidade, e nada no processo avisa." O antídoto é datar o terreno. Quatro fatos definem o React de agosto de 2026, todos da fonte oficial:

PeçaVersão estável em 18/08/2026Registro
React19.2 (patch 19.2.7, junho de 2026)react.dev/versions
React Compiler1.0 (7 de outubro de 2025)blog oficial do React
Next.js16.3 (3 de agosto de 2026)blog oficial do Next.js
TanStack Query5.101.4 (21 de julho de 2026; v6 inexiste)registro npm
TanStack Table9.1.2 (v9 estável em 4 de agosto de 2026)registro npm e releases do GitHub
react-hook-form7.85.0 (8 de agosto de 2026; v8 em beta)registro npm
nuqs2.9.6 (17 de agosto de 2026)registro npm
Zustand5.0.15 (13 de agosto de 2026)registro npm
Jotai2.20.2 (14 de julho de 2026; v3 em alpha)registro npm
Vitest4.1.10 (v5 em release candidate)registro npm e blog do Vitest
Playwright1.62.1registro npm

Versões conferidas no registro npm e nas fontes oficiais em 18 de agosto de 2026. Número de versão envelhece rápido: ao cobrar atualização, reconfira na fonte antes de citar.

Os cinco padrões de componente e o sinal de reprovação de cada um

O curso reduz a maioria das telas a cinco padrões, e o princípio que os organiza segue na documentação oficial: cada peça de estado tem um componente dono; a doc chama isso de "single source of truth" e manda subir o estado compartilhado ao pai comum em vez de duplicá-lo. Revisar vira reconhecer o padrão e procurar o sinal que o reprova:

1. Componente com props

Função tipada que devolve JSX; a prop decide a classe aplicada. Reprove quando a lista de props passou de meia dúzia e cresce a cada tela.

2. Composição por children

Invólucro genérico que cuida só de enquadramento, borda, fundo e espaçamento. É o padrão mais reutilizável do React justamente porque o invólucro dispensa saber qualquer coisa sobre o que carrega. Reprove quando o invólucro recebe props do que ele carrega.

3. Estado local com useState

Regra de ouro: atualize a partir do valor anterior, na forma (v) => v + 1, para que duas atualizações próximas deixem de se atropelar. Reprove quando o DOM é alterado na mão em vez de reconciliado.

4. Lista com map e key

A key vem do identificador do dado. A doc oficial avisa que índice como key "frequentemente leva a bugs sutis e confusos" e que key gerada na hora, como Math.random(), recria todo o DOM a cada render e perde o que o usuário digitou. Reprove quando a key é índice ou aleatória, ou o caso de lista vazia ficou sem tratamento.

5. Campo controlado

O value vem do estado e o onChange atualiza; o erro reflete na borda vermelha e no aria-invalid ao mesmo tempo. Reprove quando o erro aparece só em cor, ou só depois do envio.

O fluxo de leitura para revisar um componente devolvido, na ordem do curso: identificar o padrão; conferir se ele cabe na situação; procurar o critério no código; procurar o sinal de reprovação; e então aprovar, ou devolver com o motivo em uma frase.

A armadilha das classes montadas. O Tailwind só gera as classes que consegue ver como strings completas no código-fonte. Por isso bg-${cor}-500 ou 'text-' + tom produzem classe nenhuma no arquivo final. A solução é o mapa estático de variantes: um objeto com as strings inteiras (variantes[variante]), que o Tailwind enxerga e o revisor confere de relance. O guia de Tailwind e CSS moderno aprofunda esse lado.

Quando o widget escapa dos cinco padrões

Combobox com filtro, seletor de data e tabela navegável pelo teclado costumam ficar de fora do que um catálogo pronto de componentes entrega, e é nesse degrau que o agente improvisa uma div com onClick. O React Aria Components, mantido pela Adobe, cabe aí como dependência direta do projeto, sem intermediário: ele já traz o padrão ARIA completo do widget (papel, gerenciamento de foco, navegação por teclado, anúncio para leitor de tela) em lugar de deixar cada um desses itens para reimplementação manual. Quem chega à biblioteca por baixo de um catálogo de componentes usa esse comportamento sem enxergá-lo; instalá-la direto é o caminho para a peça que o catálogo deixou fora da lista.

A cadência de publicação ajuda a datar a entrega: a biblioteca manteve release mensal ao longo de 2026, com seleção múltipla no ComboBox na 1.16, linhas expansíveis de Table na 1.17 e o PreviewTrigger na 1.20. A pergunta que a revisão faz é curta: este widget customizado herda comportamento de uma biblioteca de acessibilidade, ou alguém escreveu o controle de foco e as teclas de seta na mão, linha a linha.

React Compiler: a memoização saiu das suas mãos

O React Compiler 1.0, estável desde 7 de outubro de 2025, é uma ferramenta de build que otimiza a aplicação por memoização automática, sem exigir reescrita. A documentação delimita o foco: melhorar a performance de atualização, pulando re-renders em cascata e cálculos caros. Ele acelera re-render; o primeiro carregamento e a rede ficam fora do escopo dele.

A recomendação oficial muda o que a revisão cobra: para código novo, confiar na memoização do compilador e reservar useMemo e useCallback para quando for preciso controle preciso; em código existente, manter a memoização já escrita ou testar com cuidado antes de remover. A doc em momento algum proíbe os dois hooks: eles viram válvula de escape. Na prática de encomenda: um componente novo coberto de useMemo em tudo que é linha é sinal de agente escrevendo o React de dois anos atrás; pergunte se o projeto já ativou o compilador antes de aceitar. Projetos novos de Expo (SDK 54 em diante) já nascem com ele ligado, e create-next-app e create-vite oferecem templates com o compilador; projeto existente precisa adotá-lo de propósito.

Confiar na memoização automática tem um pré-requisito de ferramenta: o eslint-plugin-react-compiler ligado no projeto. O compilador otimiza o componente que respeita as regras do React e pula em silêncio o componente que as viola: nada quebra, nada aparece no terminal, e a memoização que a revisão deu como certa deixou de acontecer naquele arquivo. O plugin de lint traz a violação para o editor, na linha em que ela nasce. Vale cobrá-lo junto com o compilador, porque "o projeto ativou o React Compiler" descreve a configuração do build e deixa em aberto o que sobrou otimizado componente a componente.

Onde mora cada estado: a pergunta de trinta segundos

Antes de criar qualquer estado, responda uma coisa: onde mora a verdade deste dado. O curso trata a confusão entre os tipos como a causa raiz da maioria dos bugs de estado (o sintoma clássico é uma tela mostrando um saldo e a outra mostrando outro), e errar a classificação transforma a correção: ela deixa de ser ajuste de tela e vira reescrita da camada de dados. Os cinco lugares:

Ilustração abstrata de cartões retangulares em rosa, azul-marinho e branco flutuando sobre fundo claro, conectados por linhas douradas luminosas com nós de luz, evocando componentes de interface trocando dados
Componentes trocando dados: cada cartão com um dono para o seu estado. Imagem gerada por IA.
Fluxograma de decisão: onde mora este estado Cinco perguntas em sequencia levam a local, derivado, compartilhado, servidor ou URL, cada um com sua ferramenta. Onde mora a verdade deste dado? Pertence a um componente só? Dá para calcular de outros valores? Atravessa telas sem vir do servidor? Pertence ao backend? Filtro, aba, ordenação ou página? Local useState ou useReducer Derivado calcule na renderização, não guarde Compartilhado de cliente Context; Zustand ou Jotai se frequente De servidor TanStack Query ou Server Component Na URL nuqs, o endereço da tela sim sim sim sim sim não não não não
A pergunta de trinta segundos: cada resposta "sim" aponta o lugar do estado e a ferramenta certa, antes de qualquer useState.
Tipo de estadoExemploFerramentaEvite
LocalAba de um cartão, campo abertouseState ou useReducerBiblioteca global
DerivadoTotal, lista filtradaCalcular na renderização; com o Compiler ativo, nem useMemoGuardar em useState
Compartilhado, baixa frequênciaTema, sessão, modal globalContext com useReducerStore pesado
Compartilhado, alta frequênciaCarrinho, estado de funcionalidadeZustand, com seletores e useShallowContext, que re-renderiza em cascata
Compartilhado, granularFormulário ou editor complexoJotai, por átomosUm store monolítico
Filtro, aba, paginação, busca?busca=...&página=2nuqs, estado na URLuseState que some no recarregamento
De servidorLista de produtos, perfilTanStack Query ou Server ComponentCache remontado à mão no componente
Fonte externaTamanho da janela, store própriouseSyncExternalStoreuseEffect improvisado

Quadro do curso Frontends com Vibecoding, atualizado com as recomendações das documentações oficiais em agosto de 2026.

Os números de adoção confirmam a tabela. O State of React 2025 mediu uso e retenção de cada biblioteca:

BibliotecaUsoRetenção
TanStack Query68%97%
Zustand50%94%
Jotai18%92%
Redux75% (ainda lidera o uso)34% (a retenção caiu)
Redux Toolkit54%57%

O comentário editorial da própria pesquisa resume: o Zustand "está ganhando terreno rápido" e, por liderar também em satisfação, "deve ser considerado o líder da categoria". Na semana de 9 a 15 de agosto de 2026, a API de downloads do npm registrou os downloads semanais:

A régua do curso descreve o ecossistema que o mercado de fato usa.

Estado compartilhado: o custo de re-render de cada ferramenta

A diferença entre as três ferramentas é quem redesenha quando o valor muda. Com Context e useReducer, todo consumidor re-renderiza quando o value do Provider muda, mesmo lendo uma fatia que permaneceu igual: bom para valor estável e raro, caro em alta frequência. Com Zustand, cada componente assina só a fatia que usa via seletor, sem Provider e sem cascata; a documentação da v5 avisa que seletor devolvendo referência nova a cada chamada pode causar loop infinito (o erro estampa "Maximum update depth exceeded") e prescreve o useShallow para devolver referência estável. Com Jotai, átomos primitivos se compõem e a doc garante o grão fino: átomos observados re-renderizam apenas as partes pequenas da aplicação que precisavam da atualização: o caso do formulário complexo e do editor.

Custo de re-render: Context, Zustand e Jotai Comparacao de quais componentes repintam quando o valor muda: com Context todos os consumidores repintam em cascata; com Zustand so quem assina a fatia; com Jotai so quem le o atomo alterado. Context Provider no topo todos os consumidores repintam, em cascata Zustand store fora da árvore só quem assina a fatia repinta seletor que monta objeto pede useShallow Jotai átomo alterado átomo quieto só quem lê o átomo alterado repinta componente que re-renderiza componente quieto assinatura da fatia ou do átomo
Quando o valor muda, o Context repinta todos os consumidores em cascata; o Zustand repinta só quem assina a fatia (com useShallow para referência estável); o Jotai repinta só quem lê o átomo alterado.

Três saídas antes de migrar do Context, na ordem do curso: quebrar um Context grande em vários pequenos por frequência de mudança; estabilizar o value com useMemo; e, se a alta frequência persistir, trocar por store com seletores.

Para atualização que disputa com a digitação, as primitivas de concorrência: useTransition marca a atualização como baixa prioridade e expõe o sinal de pendência; useDeferredValue deixa o valor digitado chegar na hora e adia a versão derivada; e useSyncExternalStore é o hook oficial para conectar o React a uma fonte externa; você raramente o escreve direto, e saber que ele existe explica por que o Zustand funciona com segurança no render concorrente.

Um caso à parte vem do capítulo de tabelas do curso: dado que muda várias vezes por segundo fica fora do ciclo de renderização: os dados quentes vivem no motor e a tela repinta apenas o que mudou. O teste que expõe o defeito leva um minuto: abra o painel de componentes do React e observe se o componente pai redesenha a cada atualização. Se redesenhar, o dado está no lugar errado.

Existe uma linha a mais nessa decisão, e ela atende justamente a alta frequência: os sinais reativos. O @preact/signals-react propaga a mudança com granularidade fina, atualizando o ponto da tela que lê o sinal sem levar a árvore acima dele junto no re-render, o que serve a cotação em tempo real, cronômetro e cursor de edição colaborativa. A ressalva entra colada: a convivência com o React Compiler precisa ser verificada dentro do projeto antes de adotar os dois ao mesmo tempo, porque ambos mexem no mesmo lugar, a decisão de quando o componente repinta. Adotar a dupla sem essa verificação é assumir um risco que ninguém mediu.

Quando o useEffect sobra: o critério oficial

A página "You Might Not Need an Effect" da documentação define Effects como válvula de escape do paradigma: eles existem para sincronizar o componente com um sistema externo: um widget de fora do React, a rede, o DOM do navegador. E entrega a regra na primeira dobra: sem sistema externo envolvido, você deveria dispensar o Effect. Dois abusos ganham nome próprio na doc:

Transformar dados para renderizar

Effect que lê estado, calcula e grava outro estado reinicia o processo de render do zero. A doc manda transformar os dados no topo do componente, durante o próprio render.

Tratar evento do usuário

Quando o Effect roda, você já perdeu a informação de qual interação aconteceu (qual botão foi clicado). A lógica de interação pertence ao event handler correspondente.

O critério em uma frase

Na formulação da doc: lógica causada por uma interação específica vai no event handler; lógica causada por o usuário ver o componente na tela vai no Effect.

Critério oficial: quando o useEffect sobra Sem sistema externo, dispense o Effect: dado no render, evento no handler; com sistema externo, use Effect, com o desvio useEffectEvent. Há um sistema externo envolvido? Dispense o Effect a regra da primeira dobra da doc Transformar dado calcule no topo do componente, no render Evento do usuário a lógica vai no event handler useEffect: sincronizar widget fora do React, rede, DOM do navegador Desvio: useEffectEvent (19.2) valor lido ali não re-dispara o Effect; fica fora do array de dependências não sim parte "de evento" Na revisão: todo useEffect novo nomeia o sistema externo que o justifica.
O critério oficial da doc: sem sistema externo o Effect sobra; com sistema externo ele sincroniza, e o useEffectEvent isola a parte de evento.

O 19.2 completou o quadro com o useEffectEvent: ele separa a parte "de evento" da lógica de um Effect, para que valores lidos ali dentro deixem de re-disparar o Effect inteiro; Effect Events ficam fora do array de dependências, por regra da doc. Na mesma leva, o <Activity> esconde e restaura a interface e o estado interno dos filhos: ao esconder, o React guarda o estado, destrói os Effects e oculta com display: none; ao voltar, restaura o estado e recria os Effects. Quem revisa precisa saber que painel escondido por Activity mantém o formulário preenchido ao alternar, comportamento desejado e surpreendente para quem esperava desmontagem.

Na revisão: todo useEffect novo responde à pergunta do sistema externo. Sem resposta, devolva com o critério da doc no comentário. As exceções legítimas existem (sincronizar um widget, assinar um evento do navegador), e a própria documentação prefere biblioteca de dados a fetch manual em Effect para buscar dados.

Dado de servidor: cache com dono

Buscar dado de servidor juntando estado de componente com efeitos colaterais reimplementa, à mão e mal, uma camada de cache: sem revalidação, sem deduplicação e sem estado de obsolescência. A comparação é nossa; a motivação oficial do TanStack Query descreve o mesmo cenário: sem uma solução holística, os desenvolvedores acabam "cobbling together component-based state and side-effects" para prover dado assíncrono, e as bibliotecas tradicionais de estado de cliente "are not so great at working with async or server state". A biblioteca entrega "fetching, caching, synchronizing and updating server state" com useQuery para leitura (data, isPending, isError, refetch), useMutation para escrita e invalidação por chave. A linha estável segue a v5 (5.101.4, de 21 de julho de 2026), e uma v6 inexiste no npm: entrega que cite "TanStack Query 6" está citando algo que ainda foi publicado em lugar nenhum.

Cada dado tem um dono só. O erro que todo iniciante comete é copiar o dado do servidor para dentro de um Zustand ou de um useState e manter duas cópias do mesmo número. Deixe o dado do servidor no cache da biblioteca e guarde no estado local só o que é da tela, como filtro aberto e aba selecionada. O erro de estreia da própria ferramenta: usar a mesma queryKey para consultas diferentes, o que faz uma tela mostrar o dado da outra sem aviso.

Para os estados assíncronos de envio, o React 19 trouxe três hooks, cada um com a letra miúda que derruba código de agente.

useActionState

Unifica envio, pendência e erro. Um erro lançado cancela as ações enfileiradas e aciona o Error Boundary mais próximo.

useFormStatus

Vem do pacote react-dom e só funciona chamado de um componente renderizado dentro do <form>. A doc é explícita: ele reporta o form pai, e chamá-lo no mesmo componente que renderiza o form devolve nada (o erro clássico em código gerado).

useOptimistic

Mostra o valor temporário enquanto a Action corre e reverte sozinho na falha, no padrão do curtir que pinta na hora. Use em curtir, marcar e arrastar, e mantenha pagamento fora disso.

Resposta de modelo que chega token a token

O useOptimistic cobre o valor que a interface consegue adiantar. Resposta de modelo de linguagem pede o movimento complementar da mesma família: o valor final leva segundos para existir e chega em pedaços, então a tela renderiza de forma incremental. O servidor abre um fluxo, por Server-Sent Events ou pelo corpo de um fetch lido em stream, e a interface pinta o texto parcial conforme ele chega, em vez de segurar um indicador de carregamento até a última palavra.

Duas exigências ao revisar uma tela que faz streaming. O texto parcial mora num contêiner com aria-live="polite", para que o leitor de tela acompanhe o que vai aparecendo sem cortar a fala a cada token. E o estado final entra num commit único, quando o fluxo fecha: guardar cada pedaço como estado novo transforma cada token em um render, e a conta aparece na primeira resposta longa.

A API use() lê uma Promise direto no componente e, ao contrário dos hooks, pode aparecer em condicionais e loops. O tratamento de erro é estrutural: Promise pendente aciona o fallback do <Suspense>; Promise rejeitada aciona o Error Boundary mais próximo; a doc avisa que use dentro de try-catch simplesmente falha. E o Error Boundary continua sendo a única razão sancionada para escrever classe em 2026: "There is currently no way to write an Error Boundary as a function component", diz a referência oficial, que aponta o pacote react-error-boundary para quem prefere dispensar a classe própria.

Formulários: teclar sem redesenhar o formulário inteiro

O FAQ oficial do react-hook-form explica o mecanismo: a biblioteca se apoia em formulário não controlado (o register captura uma ref, em vez de value e onChange), e essa abordagem reduz os re-renders causados pela digitação. A régua de adoção do curso segue de pé: num campo único de busca, um useState resolve com menos código; a biblioteca se justifica a partir de três campos, ou quando o formulário engasgar no celular. A versão estável é a 7.85.0, de 8 de agosto de 2026; a v8 existe só em beta; entrega baseada nela é aposta, e aposta se declara.

O modo de validação é decisão de re-render, com aviso na fonte. A doc do useForm lista os modos e carimba o onChange: validação a cada tecla, múltiplos re-renders e "impacto significativo de performance". O onTouched valida no primeiro blur e depois a cada mudança: o comportamento que o usuário espera, sem o custo.

const { register, handleSubmit, formState: { errors, isSubmitting } } =
  useForm<Cadastro>({ resolver: zodResolver(cadastroSchema), mode: "onTouched" });

A API que a revisão reconhece de relance: register liga o <input> ao formulário; handleSubmit valida antes de chamar o envio; formState expõe errors, isSubmitting e isValid. Campo que precise ser controlado entra via Controller, que isola o re-render ao próprio campo.

Filtro, aba e busca moram na URL

O quinto lugar de estado é o endereço da tela, e a ferramenta é o nuqs (2.9.6, de 17 de agosto de 2026; o pacote publica quase toda semana). A doc o apresenta como substituto direto: quem gerencia estado de interface com React.useState pode trocar por useQueryState para sincronizá-lo com a URL. Parâmetro de busca nasce string; para número, parseAsInteger converte "with parseInt (base 10)", e o valor default fica interno ao React: ele só vai para a URL se for setado explicitamente. Desde a versão 2 o uso exige envolver a aplicação no NuqsAdapter do framework (a doc lista adapters para Next.js, SPA com Vite, Remix, React Router v6, v7 e v8 e TanStack Router), e esquecê-lo na raiz é o erro de estreia: o valor nunca chega ao endereço.

O ganho de negócio que o curso destaca continua o argumento decisivo: o cliente manda o link do filtro para um colega, e o suporte reproduz a tela exata de uma reclamação. O guia de menus, abas e paginação retoma a mesma régua do lado da navegação. E para projeto fora do Next.js, os roteadores atuais são o React Router, na major 8 ("a user-obsessed, standards-focused, multi-strategy router", na definição do site oficial), e o TanStack Router, focado em type-safety: "the route tree is the application contract".

Next.js 16: a fronteira, o cache e a versão mínima

O Next.js 16, de 21 de outubro de 2025, mexeu no chão que o agente pisa em quatro pontos.

Turbopack virou o padrão

O Turbopack ficou estável e virou o bundler padrão de projetos novos.

middleware.ts virou proxy.ts

O middleware.ts foi renomeado para proxy.ts, rodando em Node.js. A forma antiga segue aceita no Edge runtime, já deprecada e com remoção anunciada.

Acesso assíncrono obrigatório

params, cookies() e headers() passaram a exigir acesso assíncrono.

Cache Components

O cache implícito do App Router deu lugar aos Cache Components com a diretiva use cache, habilitada desde o 16.0 e ainda opt-in via cacheComponents: true.

O 16.3, de 3 de agosto de 2026, somou até 90% menos memória no dev server e a suíte opt-in Instant Navigations, de cinco ferramentas, incluindo o helper de teste instant() para Playwright.

Sinal de entrega datada: código que o agente devolver com middleware.ts novo, params síncrono ou experimental.ppr é código do Next de 2024.

Ilustração abstrata em duas camadas: blocos geométricos azul-marinho na parte inferior e painéis translúcidos claros na superior, separados por uma linha luminosa rosa que pacotes de luz rosa e dourados atravessam, evocando a fronteira entre servidor e navegador
A fronteira entre servidor e navegador: só cruza o que é serializável. Imagem gerada por IA.

Sobre a fronteira, a doc oficial diz exatamente onde a diretiva vai: "use client" declara um ponto de entrada para renderização no cliente, no topo do arquivo, antes de qualquer import; ela dispensa repetição em todo arquivo de Client Component; entra só nos arquivos que servem de fronteira, e as props que a cruzam precisam ser serializáveis. O erro clássico que o curso descreve continua: escrever a diretiva em todo arquivo para calar o editor manda o componente inteiro para o navegador e joga fora o principal ganho do framework. Do outro lado, "use server" marca as Server Functions; para chamá-las do cliente, elas vivem em arquivo dedicado com a diretiva no topo.

Fronteira servidor-navegador do Next.js Server Components no alto, o arquivo com use client como ponto de entrada e props serializaveis cruzando a linha da fronteira. Servidor: Server Components (padrão) Layout (Server) Página (Server) Fronteira props que cruzam precisam ser serializáveis props serializáveis "use client" ponto de entrada, topo do arquivo Import: vira Client Component Import: sem repetir a diretiva Navegador Diretiva só nos arquivos de fronteira: em todo arquivo, o componente inteiro vai ao navegador.
A fronteira do Next.js 16: Server Components por padrão no alto, o arquivo com "use client" como ponto de entrada e só props serializáveis cruzando a linha.

Segurança virou critério de aceite. O July 2026 Security Release do Next.js, de 20 de julho de 2026, corrigiu nove CVEs, entre eles CVE-2026-64641 (negação de serviço via Server Actions, severidade alta), CVE-2026-64642 (bypass de proxy/middleware com Turbopack e um único locale, alta) e CVE-2026-64649 (SSRF em Server Actions em servidores custom, alta), com correções nas versões 16.2.11 e 15.5.21. Duas consequências práticas: o time cobra do agente versão mínima 16.2.11 (ou 15.5.21 na linha antiga) em qualquer entrega, e as recomendações da doc para Server Functions entram na revisão: autenticar e autorizar antes de operação sensível, ler autenticação de cookies ou headers em vez de aceitar token como parâmetro, e retornar só o que a interface precisa, porque o valor de retorno é serializado e enviado ao cliente.

Tela de dados: a escada e o v9 que mudou a conta

A escada do curso para lista longa segue válida: tabela nativa até alguns milhares de linhas; virtualização (TanStack Table para a lógica, TanStack Virtual 3.14.9 para desenhar só o visível) até a casa das cem mil; fatias pelo servidor quando a medição condenar o degrau de baixo; e desenhar como imagem só aceitando o preço de reconstruir a acessibilidade à mão. Sobe-se um degrau por vez, com medição.

Escada de quatro degraus para tela de dados Quatro degraus em ordem: tabela nativa, virtualizacao com TanStack Table v9 e Virtual, fatias pelo servidor e desenhar como imagem; sobe-se um degrau por vez, com medicao. Suba só com medição 1 Tabela nativa até alguns milhares de linhas 2 Virtualização TanStack Table v9 + TanStack Virtual até a casa das cem mil parte de 5kb, features declaradas 3 Fatias pelo servidor quando a medição condenar o degrau de baixo 4 Desenhar como imagem só aceitando o preço: acessibilidade reconstruída à mão sobe-se um degrau por vez, com medição
A escada para lista longa: tabela nativa até alguns milhares de linhas, virtualização com TanStack Table v9 e Virtual até a casa das cem mil, fatias pelo servidor quando a medição condenar o degrau de baixo, e imagem só aceitando reconstruir a acessibilidade à mão.

O degrau dois mudou de conta em 4 de agosto de 2026, quando o TanStack Table v9 saiu estável.

O modelo invertido

O guia de migração oficial inverte o modelo: cada tabela declara explicitamente as features que usa, via tableFeatures(), e o pacote parte de "5kb of bundled JS": tabela que só ordena deixa de embarcar o código de filtro e paginação.

O atalho que anula o ganho

O mesmo guia avisa: o modo de compatibilidade useLegacyTable inclui todas as features e "resulting in a larger bundle size than you even got with Table V8".

O passo de ouro na revisão

Registrar só os recursos que a tela usa e rodar o analisador de pacote antes e depois; ganho de peso sem medição é conversa.

Efeitos colaterais da virtualização

Os dois valem também aqui: o Ctrl+F do navegador deixa de encontrar o que ainda foi desenhado (ofereça busca própria) e a navegação por teclado precisa ser reconstruída.

Testes: comportamento, papel e navegador de verdade

A régua segue a da Testing Library, que a doc formula sem rodeio: o teste deve se parecer com o jeito que o usuário interage com a tela, e o getByRole, que consulta a árvore de acessibilidade, "should be your top preference for just about everything". A frase seguinte da doc é o bônus da revisão: se o papel deixa o elemento inalcançável, "it's possible your UI is inaccessible": o teste que falha em achar o botão pelo papel está denunciando a tela, além do código.

O ferramental de 2026 encorpou em três frentes.

Vitest 4

Lançado em 22 de outubro de 2025, removeu o selo experimental do Browser Mode e ganhou teste de regressão visual: componente rodando em navegador de verdade, com pacotes de renderização para React entre outros. A estável é a 4.1.10, com a v5 em release candidate.

Playwright

Aposentou os pacotes experimentais de component testing: o guia atual monta uma galeria de "stories" servida pelo próprio dev server, com a fixture mount() no @playwright/test comum (1.62.1): cliques reais, layout real, regressão visual possível.

Next.js 16.3 com Instant Navigations

Quem o usa ainda ganha o helper instant() para afirmar o que deve aparecer instantaneamente numa navegação.

A rede sob controle no teste de componente

Consultar pelo papel resolve metade do problema; a outra metade é o dado que o componente busca. Um componente montado sobre TanStack Query só se comporta como em produção quando a resposta da rede é controlável no teste, e trocar o fetch por uma função falsa amarra o teste ao detalhe de implementação que a própria régua da Testing Library manda evitar. O MSW (Mock Service Worker) intercepta a requisição na camada de service worker: o componente dispara a chamada de sempre, e o teste decide o que volta, com atraso, com erro ou com a lista inteira. Aí o ciclo fecha, porque o mesmo getByRole passa a afirmar os três estados que o usuário vê, carregando, falhou e chegou, sobre uma rede que o teste governa.

Como revisar o que o agente devolve: a checklist de 2026

Infográfico ilustrado em estilo de mapa antigo resumindo o guia: padrões de componente com sinais de reprovação, o mapa dos cinco lugares do estado (local, derivado, compartilhado, servidor e URL), a tabela de ferramenta por tipo de estado, o piso de versão React 19.2 e Next.js 16.2.11 e a regra do useEffect só para sistemas externos
Resumo visual do guia, gerado por IA no NotebookLM. A grafia de alguns rótulos escorrega, um vício conhecido da geração de imagem; os números estão certos e o texto do guia prevalece.

O que este guia deixa de fora, e por quê

O guia cobre a revisão e a encomenda; ficam fora, por serem pré-requisito ou especialidade: a sintaxe do JSX em si; o mecanismo interno de reconciliação e o funcionamento do compilador por dentro; o bootstrap de um projeto novo; hooks customizados; a tipagem avançada de TypeScript com React; e a mecânica completa de Server Actions além das recomendações de segurança citadas. Quando o trabalho esbarrar num desses temas, a fonte é a documentação oficial de cada projeto: react.dev, nextjs.org e as docs de cada biblioteca da tabela de versões.

Guias para postar

Dois guias prontos para o LinkedIn e o Instagram

Cada cartão abaixo foi desenhado para sair como imagem: escolha o formato, abra a tela de print, capture a área do cartão e publique com a legenda que o botão copia. O conteúdo resume o método desta página, então o post leva o leitor de volta para cá.

Design · React e estadoLeadlovers 2026

Os cinco lugares onde um dado pode morar

Antes de criar qualquer estado, decida de quem é a verdade daquele dado.
  1. Local fica no próprio componente. Aba aberta e campo em foco vivem ali, e só ali.
  2. Derivado ninguém guarda. Total e lista filtrada saem do cálculo na hora de desenhar a tela.
  3. Compartilhado de cliente atravessa telas. Tema, sessão e carrinho pedem uma loja própria.
  4. Dado de servidor mora no cache. Copiar para dentro da tela cria dois números diferentes.
  5. Filtro e busca moram no endereço. O link reproduz a tela exata que o cliente reclamou.
brasilgeo.ai/leadlovers2026Guia 1 de 2
Legenda sugerida para LinkedIn e Instagram
Duas telas mostrando saldos diferentes quase sempre têm a mesma origem: o mesmo dado guardado em dois lugares.

O guia de React do portal resolve isso com uma pergunta de trinta segundos, feita antes de criar qualquer estado: onde mora a verdade deste dado. São cinco respostas possíveis. O que pertence a um componente só fica local. O que dá para calcular ninguém guarda. O que atravessa telas vai para uma loja de cliente. O que vem do servidor fica no cache, com dono. E filtro, aba e busca moram no endereço da tela.

Errar a classificação sai caro: a correção deixa de ser ajuste de tela e vira reescrita da camada de dados.

Comente qual dos cinco lugares mais confunde o seu time.

Guia completo: brasilgeo.ai/leadlovers2026/design/react/

#Leadlovers #React #Frontend #DesignDeProduto
Design · React e estadoLeadlovers 2026

Sinais de que a entrega usa o React de 2024

Confira antes de aceitar a tela que um agente de IA devolveu.
  • Versão inventada denuncia na hora. React 19.3, React 20 e TanStack Query v6 existem em lugar nenhum.
  • Arquivo middleware.ts com o nome antigo mostra que o código ignorou o Next.js 16.
  • Memoização escrita à mão em tudo pede explicação. Pergunte se o projeto ativou o React Compiler.
  • Todo useEffect nomeia o sistema externo que o justifica. Sem esse nome, ele volta para quem escreveu.
  • Peça o teste que acha o botão pelo papel. Ele prova o comportamento e denuncia tela inacessível.
brasilgeo.ai/leadlovers2026Guia 2 de 2
Legenda sugerida para LinkedIn e Instagram
O agente escreve muito bem o React de dois anos atrás: acerta a estrutura, erra a atualidade, e nada no processo avisa.

O guia de React do portal transforma esse risco em uma revisão curta. Comece pela data da entrega. O estável é o React 19.2 e a série corrente do Next.js é a 16.3, verificados em 18/08/2026 nas fontes oficiais; versão acima disso foi inventada pelo agente. Depois olhe o resto: arquivo middleware.ts com o nome antigo, memoização escrita à mão em todo componente novo, useEffect sem sistema externo nomeado e teste que procura o botão pelo texto em vez do papel.

Cinco conferências resolvem boa parte do retrabalho que chegaria semanas depois.

Comente qual desses sinais mais aparece nas entregas que você recebe.

Guia completo: brasilgeo.ai/leadlovers2026/design/react/

#Leadlovers #React #NextJS #RevisaoDeCodigo

Perguntas frequentes

O que o React Compiler muda na revisão de código?

O React Compiler 1.0, estável desde 7 de outubro de 2025, memoiza sozinho o que antes se escrevia à mão. Para código novo, a recomendação oficial é confiar no compilador e reservar useMemo e useCallback para quando for preciso controle preciso. Componente novo coberto de useMemo em tudo que é linha é sinal de agente escrevendo o React de dois anos atrás: pergunte se o projeto já ativou o compilador.

Quando um useEffect se justifica?

Quando existe um sistema externo para sincronizar: um widget de fora do React, a rede ou o DOM do navegador. A página You Might Not Need an Effect, da documentação oficial, entrega a régua: sem sistema externo envolvido, dispense o Effect. Derivar estado de outro estado acontece durante o próprio render, e lógica de interação pertence ao event handler correspondente.

Onde deve morar o dado que vem do servidor?

No cache de uma biblioteca como o TanStack Query, com useQuery para leitura, useMutation para escrita e invalidação por chave. Copiar o dado do servidor para um useState ou um Zustand cria duas cópias do mesmo número, e uma tela passa a mostrar um saldo diferente da outra. O estado local guarda só o que é da tela, como filtro aberto e aba selecionada.

Quando trocar o Context por Zustand ou Jotai?

Depois de esgotar as três saídas do curso: quebrar um Context grande em vários pequenos por frequência de mudança, estabilizar o value com useMemo e, se a alta frequência persistir, migrar para store com seletores. Com Context, todo consumidor re-renderiza quando o value do Provider muda; com Zustand, cada componente assina só a fatia que usa; com Jotai, átomos re-renderizam apenas as partes pequenas que precisavam da atualização.

Qual versão mínima do Next.js cobrar em qualquer entrega?

A 16.2.11, ou a 15.5.21 na linha antiga: são as versões com as correções do July 2026 Security Release, que fechou nove CVEs, entre eles negação de serviço e SSRF em Server Actions. No Next.js 16 o middleware.ts foi renomeado para proxy.ts; entrega com middleware.ts novo, params síncrono ou experimental.ppr é código do Next de 2024.

Por que a key de uma lista deve vir do identificador do dado?

A documentação oficial do React avisa que índice como key frequentemente leva a bugs sutis e confusos, e que key gerada na hora, como Math.random(), recria todo o DOM a cada render e perde o que o usuário digitou. A key vem do identificador do próprio dado, e a revisão reprova lista com key de índice ou aleatória, ou com o caso de lista vazia sem tratamento.

Por onde começar

Assista à aula e abra o último componente React que o time recebeu de um agente com três perguntas deste guia: qual dos cinco padrões ele é, e qual o sinal de reprovação daquele padrão; onde mora a verdade de cada estado, com a tabela de ferramentas ao lado; e que versão de React e de Next.js a entrega assume; o piso de segurança é 16.2.11. O que falhar vira o backlog da semana. O menu Design continua nos guias de ícones e imagens, navegação, diagramas e Tailwind, e o vocabulário das aulas mora no glossário.