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 minPodcast: React em 2026A conversa aprofundada sobre as mesmas decisões · 33 min
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:
A versão estável é a 19.2, anunciada em 1º de outubro de 2025, com o patch 19.2.7 de junho de 2026 (página de versões do react.dev). O release trouxe <Activity>, useEffectEvent e o agrupamento das revelações de Suspense no SSR. Versão 19.3 ou React 20 ainda inexistem; desconfie de código ou artigo que os cite.
O React Compiler chegou ao 1.0 estável em 7 de outubro de 2025: memoização automática em tempo de build, sem reescrita de código (blog oficial do React).
O Next.js estável é o 16, de 21 de outubro de 2025, com a série corrente 16.3 de 3 de agosto de 2026 (blog oficial do Next.js).
O React mudou de dono: em 24 de fevereiro de 2026, React, React Native e o JSX passaram da Meta para a React Foundation, fundação independente hospedada pela Linux Foundation (blog oficial do React). Nada muda no código; muda quem governa o projeto.
Peça
Versão estável em 18/08/2026
Registro
React
19.2 (patch 19.2.7, junho de 2026)
react.dev/versions
React Compiler
1.0 (7 de outubro de 2025)
blog oficial do React
Next.js
16.3 (3 de agosto de 2026)
blog oficial do Next.js
TanStack Query
5.101.4 (21 de julho de 2026; v6 inexiste)
registro npm
TanStack Table
9.1.2 (v9 estável em 4 de agosto de 2026)
registro npm e releases do GitHub
react-hook-form
7.85.0 (8 de agosto de 2026; v8 em beta)
registro npm
nuqs
2.9.6 (17 de agosto de 2026)
registro npm
Zustand
5.0.15 (13 de agosto de 2026)
registro npm
Jotai
2.20.2 (14 de julho de 2026; v3 em alpha)
registro npm
Vitest
4.1.10 (v5 em release candidate)
registro npm e blog do Vitest
Playwright
1.62.1
registro 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:
Componentes trocando dados: cada cartão com um dono para o seu estado. Imagem gerada por IA.
Local: pertence a um componente só (aba ativa, campo aberto); mora em useState ou useReducer.
Derivado: calculável de outros valores (total, lista filtrada); calcule na renderização em vez de guardar: guardar cria duas fontes de verdade que divergem na primeira alteração.
Compartilhado de cliente: atravessa telas sem vir do servidor (tema, sessão, carrinho); Context para baixa frequência, Zustand ou Jotai para alta frequência e estado granular.
De servidor: pertence ao backend (lista de pedidos); mora em camada de cache: TanStack Query ou Server Component.
O quinto lugar, esquecido: o endereço da tela: filtro, aba, ordenação e página moram na URL, via nuqs.
A pergunta de trinta segundos: cada resposta "sim" aponta o lugar do estado e a ferramenta certa, antes de qualquer useState.
Tipo de estado
Exemplo
Ferramenta
Evite
Local
Aba de um cartão, campo aberto
useState ou useReducer
Biblioteca global
Derivado
Total, lista filtrada
Calcular na renderização; com o Compiler ativo, nem useMemo
Guardar em useState
Compartilhado, baixa frequência
Tema, sessão, modal global
Context com useReducer
Store pesado
Compartilhado, alta frequência
Carrinho, estado de funcionalidade
Zustand, com seletores e useShallow
Context, que re-renderiza em cascata
Compartilhado, granular
Formulário ou editor complexo
Jotai, por átomos
Um store monolítico
Filtro, aba, paginação, busca
?busca=...&página=2
nuqs, estado na URL
useState que some no recarregamento
De servidor
Lista de produtos, perfil
TanStack Query ou Server Component
Cache remontado à mão no componente
Fonte externa
Tamanho da janela, store próprio
useSyncExternalStore
useEffect 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:
Biblioteca
Uso
Retenção
TanStack Query
68%
97%
Zustand
50%
94%
Jotai
18%
92%
Redux
75% (ainda lidera o uso)
34% (a retenção caiu)
Redux Toolkit
54%
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:
TanStack Query: 55,8 milhões.
react-hook-form: 50,4 milhões.
Zustand: 44,4 milhões.
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.
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.
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.
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.
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.
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.
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
Date a entrega: React 19.2 e Next.js 16.2.11 ou mais novo (o release de segurança de julho de 2026 é o piso). Menção a React 19.3, React 20 ou TanStack Query v6 denuncia invenção.
Identifique o padrão do componente e aplique o sinal de reprovação da tabela dos cinco padrões.
Componente novo coberto de useMemo e useCallback: pergunte se o projeto ativou o React Compiler antes de aceitar memoização manual em tudo.
Todo useEffect novo nomeia o sistema externo que o justifica; sem resposta, devolva com o critério da doc.
Pergunte de cada estado onde mora a verdade daquele dado. Trinta segundos aqui evitam a reescrita da camada de dados.
Dado de servidor mora em cache com dono (TanStack Query ou Server Component); cópia dele num store local é o bug de amanhã.
"use client" só nos arquivos de fronteira; middleware.ts novo virou proxy.ts; Server Function autentica por cookies ou headers e devolve só o que a tela usa.
Em lista, a key vem do identificador do dado; em seletor do Zustand que monta objeto, exija useShallow.
Em tabela com TanStack Table v9, confira o tableFeatures() enxuto e recuse o useLegacyTable sem justificativa.
Peça o teste com getByRole: ele prova o comportamento e denuncia tela inacessível no mesmo movimento.
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.
Local fica no próprio componente. Aba aberta e campo em foco vivem ali, e só ali.
Derivado ninguém guarda. Total e lista filtrada saem do cálculo na hora de desenhar a tela.
Compartilhado de cliente atravessa telas. Tema, sessão e carrinho pedem uma loja própria.
Dado de servidor mora no cache. Copiar para dentro da tela cria dois números diferentes.
Filtro e busca moram no endereço. O link reproduz a tela exata que o cliente reclamou.
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.
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.