react-useeffect-review · git:20261011.a095182 · 2026-10-11 · sha256 d7fdd6b5e7641cda
react-useeffect-review git:20261011.a095182A
Immutable. This exact content never changes and is served at /api/v1/blob/d7fdd6b5e7641cda.
---
name: react-useeffect-review
description: |
Checklist React para decidir quando não usar useEffect em estado derivado, fetch,
sincronização e reset de props. Trigger em: "useEffect", "estado derivado",
"race condition no fetch", "sincronizar estado", "resetar estado quando prop muda",
"effect chain", "notificar parent via effect", "useSyncExternalStore",
"por que renderizou duas vezes".
---
# React useEffect — Quando NAO Usar
Effects sao uma **valvula de escape** do React: servem pra sincronizar com um
sistema externo (DOM nao-React, API do browser, subscription de store
externa). Se nao ha sistema externo envolvido, provavelmente nao precisa de
Effect — e o codigo com Effect desnecessario tende a rodar em passes extras,
causar race condition ou disparar em momentos inesperados (ex: refresh de
pagina).
Esta skill entra em dois momentos: (1) ao escrever um `useEffect` novo, como
checklist antes de commitar; (2) ao revisar codigo/PR que usa `useEffect`,
como lente pra achar o antipattern especifico e sugerir a alternativa direta.
## Governanca Global
Esta skill segue `GLOBAL.md`, `policies/execution.md`, `policies/handoffs.md`.
## Quando Usar
- escrever um `useEffect` novo, como checklist antes de commitar
- revisar código/PR que usa `useEffect`, pra achar o antipattern específico
- componente renderiza duas vezes de forma inesperada, ou tem race condition em fetch
- estado parece sincronizado manualmente quando poderia ser calculado direto
## Quando Nao Usar
- a sincronização é de fato com um sistema externo (widget não-React, API de browser, subscription) — aí o Effect é a ferramenta certa
- o código já usa `useSyncExternalStore`, `key` prop, ou calcula no render corretamente — nada a revisar
## Quick Reference
| Situacao | NAO FACA | FACA |
| ------------------------------- | ------------------------------- | ---------------------------------------- |
| Estado derivado de props/state | `useState` + `useEffect` | Calcular durante o render |
| Calculo caro | `useEffect` pra cachear | `useMemo` |
| Resetar estado ao mudar prop | `useEffect` com `setState` | `key` prop |
| Resposta a evento do usuario | `useEffect` observando state | Direto no event handler |
| Notificar parent de uma mudanca | `useEffect` chamando `onChange` | Chamar no mesmo event handler |
| Fetch de dados | `useEffect` sem cleanup | `useEffect` com cleanup OU lib de fetch |
## Arvore de Decisao
```
Precisa responder a algo?
├── Interacao do usuario (click, submit, drag)?
│ └── EVENT HANDLER
├── Componente apareceu na tela e precisa sincronizar com algo externo?
│ └── EFFECT (widget nao-React, analytics, subscription)
├── Prop/state mudou e precisa de um valor derivado?
│ └── CALCULAR DURANTE O RENDER
│ └── Caro? use useMemo
└── Precisa resetar estado quando uma prop de identidade muda?
└── KEY PROP no componente filho
```
## Quando DE FATO precisa de Effect
- Sincronizar com **sistema externo** (widget nao-React, API de browser)
- **Subscription** a store externo (preferir `useSyncExternalStore`)
- Analytics/log que deve rodar porque o componente foi exibido
- Data fetching com cleanup adequado (ou usar mecanismo de fetch do framework)
## Guia Detalhado
- [anti-patterns.md](./anti-patterns.md) — 9 antipatterns com exemplo ruim/bom lado a lado (estado derivado, filtro em Effect, reset via Effect, logica de evento em Effect, chain de Effects, notificar parent, subir dado pro parent, fetch sem cleanup, inicializacao duplicada em dev)
- [alternatives.md](./alternatives.md) — as alternativas em detalhe (calcular no render, `useMemo`, `key` prop, guardar ID em vez de objeto, event handler, `useSyncExternalStore`, lifting state up, custom hook de fetch)
## Evidencia de Conclusao
- código revisado não tem `useEffect` cobrindo um dos 9 antipadrões de `anti-patterns.md`
- toda sincronização com sistema externo restante está justificada (subscription, widget não-React, analytics)
## Handoff
- **Frontend Engineer (skill 04)** — recebe o código já revisado antes de integrar com o resto da feature
- **Reviewer (skill 11)** — pode citar esta skill como critério de qualidade no checklist de código
## Integracao com Pipeline
- **Frontend Engineer (04):** consultar antes de escrever `useEffect` novo, ou ao revisar PR com hooks
- **Reviewer (11):** critério de qualidade de código React durante review final
## Fontes
Conteúdo adaptado do skill público `react-useeffect` do repositório
[wealthfolio/wealthfolio](https://github.com/wealthfolio/wealthfolio)
(`.claude/skills/react-useeffect/`), que por sua vez destila a doc oficial
["You Might Not Need an Effect"](https://react.dev/learn/you-might-not-need-an-effect).
Sem acoplamento a nenhum projeto específico — aplicável a qualquer codebase
React/Next.js do kit.