22 de Março de 2025
Effects Sem Bagunca
Como usar effects sem transformar sincronização, fetch e evento colateral numa pilha de comportamento difícil de prever.
Andrews Ribeiro
Founder & Engineer
3 min Intermediario Frontend
Trilha
Trilha para entrevistas de senior frontend
Etapa 6 / 15
O problema
useEffect vira bagunca rápido quando passa a ser usado como fita adesiva para qualquer coisa estranha na tela.
De repente, tem effect derivando estado, tentando sincronizar variaveis que nem deveriam existir e remendando ordem de renderização no susto.
O código pode até funcionar hoje, mas logo fica difícil prever quando algo roda e por que rodou.
Modelo mental
Effect não existe para controlar o ciclo de renderização do React.
Effect existe para sair do React e sincronizar o componente com o mundo externo:
- fazer um fetch
- iniciar um
setInterval - assinar um listener global
- integrar uma biblioteca externa que mexe no DOM de forma imperativa
Se a lógica pode ser calculada no render ou resolvida dentro de um handler de clique, ela provavelmente não pertence a um effect.
Uma heuristica simples ajuda bastante:
- se não existe sistema externo envolvido, desconfie do effect
Quebrando o problema
Antes de escrever useEffect, faca estas perguntas:
- Com qual sistema externo eu estou tentando sincronizar este componente?
- Eu consigo calcular esse valor normalmente durante o render?
- Essa ação deveria acontecer apenas porque o usuário clicou em alguma coisa?
- O cleanup esta obvio para quando o componente desmontar?
Responder isso com honestidade elimina boa parte dos effects desnecessarios.
Também evita um erro comum: usar effect para “forcar ordem” quando o problema real era estado mal modelado ou responsabilidade mal separada.
Exemplo simples
Olhe esta armadilha comum:
const [filteredUsers, setFilteredUsers] = useState<User[]>([])
useEffect(() => {
setFilteredUsers(users.filter((user) => user.name.includes(search)))
}, [users, search])
Parece inocente, mas filteredUsers e totalmente derivado de users e search.
Aqui você esta forçando um segundo passo de renderização só para manter sincronizado um estado que nem precisava existir.
A versão mais previsivel e esta:
const filteredUsers = users.filter((user) => user.name.includes(search))
O código fica mais fácil de ler e você remove um re-render desnecessario.
Outro caso comum e submit de formulario:
- ruim: guardar um
shouldSubmitno estado e usar effect para disparar a chamada - melhor: fazer a chamada direto no handler de submit
Quando o gatilho e uma ação explicita do usuário, o handler normalmente e mais claro do que um effect esperando um estado mudar.
Erros comuns
- Usar effect para derivar ou espelhar estado.
- Colocar lógica de clique ou envio de formulario dentro de effect em vez de usar handlers.
- Confiar no array de dependências para “consertar” uma modelagem ruim.
- Esquecer cleanup em timer, subscription ou listener.
Tem outro erro frequente: usar effect para copiar prop em estado local sem motivo forte. Isso costuma criar mais um ponto de sincronização para dar errado.
Como um senior pensa
Quem tem mais experiência não olha para um effect perguntando “qual dependência esta faltando?”.
Pergunta isto:
“Eu estou mesmo sincronizando com um sistema externo ou só usando effect para compensar uma modelagem ruim de estado?”
Essa pergunta mata metade dos effects de uma base antes mesmo do commit.
Senioridade aparece aqui em preferir menos magia e mais fluxo previsivel. Effect bom costuma ser pequeno, explicavel e claramente conectado a algo fora do React.
O que o entrevistador quer ver
Em entrevista de React, como você lida com side effects mostra bem seu nivel.
- Você entender para que um effect realmente existe.
- Você separar sincronização externa de derivacao interna.
- Você priorizar previsibilidade, cleanup e evitar render em cadeia.
Uma resposta forte costuma soar assim:
“Eu uso effect quando preciso sincronizar o componente com algo externo, como fetch, timer, listener ou biblioteca imperativa. Se eu consigo resolver no render ou no handler, prefiro isso porque deixa o fluxo mais previsivel.”
Effect bom conecta o componente ao mundo externo. Effect ruim só tapa buraco de modelagem.
Resumo rápido
O que vale manter na cabeça
- Effect existe para sincronizar com algo externo ao React, não para derivar estado nem controlar render no susto.
- Se a lógica pode acontecer no render ou dentro de um handler, normalmente ela não precisa de `useEffect`.
- Dependência demais em effect costuma ser sintoma de modelagem ruim de estado, não falta de dependência no array.
- Cleanup claro e parte da definição de um effect bom, não detalhe opcional.
Checklist de pratica
Use isto ao responder
- Consigo dizer com qual sistema externo cada effect do componente esta sincronizando?
- Sei identificar quando um effect esta só derivando estado que poderia ser calculado no render?
- Consigo explicar por que evento de clique deveria ficar no handler e não num effect?
- Sei revisar um effect pensando em previsibilidade e cleanup?
Você concluiu este artigo
Parte da trilha: Trilha para entrevistas de senior frontend (6/15)
Próximo passo
O Que Roda no Cliente e no Servidor Próximo passo →Compartilhar esta página
Copie o link manualmente no campo abaixo.