As armadilhas do useEffect se concentram no array de dependências: uma dependência ausente lê um valor obsoleto, chamar setState dentro de um Effect que também depende desse estado causa um loop infinito, uma dependência de objeto ou função é uma nova referência a cada renderização, e esquecer o cleanup empilha listeners duplicados. Reconheça essas quatro classes de problema e a maioria dos Effects se torna segura, pois o corpo do Effect finalmente faz apenas o que seu nome promete.
Grupo
Roteamento e Gerenciamento
Tipo
Padrão
ℹ️ Informação O editor transpila JSX para JavaScript e renderiza a UI real na sandbox; os componentes são montados automaticamente — sem render manual.
📝 Sintaxe
useEffect(() => {
document.title = 'Current ' + count + ' times' // ① if you use count, declare it as a dependency
}, [count]) // ② dependency array: re-run only when it changes
useEffect(() => {
const id = setInterval(tick, 1000)
return () => clearInterval(id) // ③ clean up on unmount to avoid stacking
}, [])
Retorna:Sem valor de retorno; trata-se de um padrão de codificação, não de uma API chamável.
▶ Exemplo
O exemplo roda direto: renderiza automaticamente ao expandir e edições valem na hora.
Saída:
A lista é atualizada conforme você digita, e o contador de execuções do Effect só aumenta quando query muda; abaixo, estão descritas as consequências das três grandes armadilhas: dependência ausente, loop infinito e dependência de objeto.
⚠️ Aviso Definir estado dentro de um Effect quando esse mesmo estado também é uma dependência é a principal fonte de loops infinitos; pergunte-se primeiro: "será que esse valor poderia ser derivado durante a renderização?".
💡 Dica Dependências de objeto, array e função são novas referências a cada renderização — envolva-as com useMemo/useCallback, ou reduza a dependência a um valor primitivo.
ℹ️ Informação Em desenvolvimento, o React 18 StrictMode monta, desmonta e remonta cada Effect de propósito, o que revela cleanups ausentes para você.
R Um setState dentro do Effect muda um valor que também é uma dependência → o estado muda → o Effect roda de novo → ele define o estado novamente, e assim por diante. Resolva removendo essa dependência, reduzindo a lista de dependências ou derivando o valor durante a renderização.
P O que exatamente deve ir no array de dependências?
R Todo valor reativo que o Effect lê: props, state e variáveis e funções definidas dentro do componente. A regra exhaustive-deps do eslint lembra você dos que você esquece.
P Um array vazio [] significa que ele roda apenas uma vez?
R Significa "independente de qualquer valor": roda uma vez na montagem e o cleanup roda na desmontagem. Se ele lê state internamente, sempre vê o valor inicial — a armadilha do fechamento.
Equipe Técnica Web-Tutorial
Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.