O React compara cada dependência com o valor dela do render anterior usando Object.is e só executa o efeito de novo se alguma mudou. Um array vazio significa rodar uma vez depois da montagem; omitir o array significa rodar depois de todo render. Dá errado quando você deixa uma dependência de fora e captura um valor obsoleto, ou quando você inclui um objeto ou função recriados a cada render, o que faz o efeito entrar em loop infinito.
Por que os entrevistadores perguntam isso
É nos efeitos que mora a maioria dos bugs de React, então o entrevistador está sondando se você entende closures e snapshots de render em vez de tratar o array como um encantamento mágico. Ele quer ouvir que você não silencia a regra do lint, que você sabe nomear a diferença entre uma closure obsoleta e um loop infinito, e de preferência que você questiona se o efeito precisa existir.
Como estruturar sua resposta
- Explique a comparação e quando o efeito de fato roda de novo.
- Descreva as duas falhas clássicas: closure obsoleta e loop de render.
- Diga como você conserta cada uma, com updates funcionais, refs ou içando valores para fora.
- Termine questionando se o efeito deveria estar ali.
Exemplo de resposta
O React guarda o array do último render e compara item por item com Object.is. Se tudo bater, ele pula o efeito; se algo diferir, ele roda o cleanup do antigo e depois o novo. O detalhe é que o efeito fecha sobre as props e o estado do render que o criou, então se eu deixo algo de fora do array eu fico com um valor obsoleto que envelhece em silêncio. O outro lado disso é colocar um objeto ou uma arrow function ali dentro, porque essas são referências novas a cada render, então o efeito roda em loop. Meus consertos de sempre são updates de estado funcionais, para eu não precisar do valor atual como dependência, içar constantes para fora do componente, e só embrulhar um callback quando ele realmente precisa ser dependência. Sinceramente, porém, a primeira pergunta que eu faço é se o efeito deveria existir. A maioria dos efeitos que eu já deletei calculava estado derivado, o que é só uma conta durante o render, ou buscava dados que pertenciam ao router ou a uma biblioteca de query.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Como você lida com um efeito que precisa do valor mais recente mas não deveria rodar de novo quando ele muda?
- Quando você usaria useLayoutEffect no lugar?
- O que roda primeiro, o cleanup do efeito antigo ou o efeito novo?
Mais perguntas para Desenvolvedor React
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas