Todo consumidor re-renderiza quando o valor do provider muda por referência, não importa qual parte do valor ele lê, porque context não tem seletor. Um provider segurando um objeto grande construído do zero a cada render vai, portanto, re-renderizar todos os consumidores o tempo todo. Conserte memoizando o valor, separando estado e dispatch em contexts diferentes, ou guardando os dados numa store externa que os consumidores assinam com seletores.
Por que os entrevistadores perguntam isso
Context é a API mais mal usada do React, então o entrevistador quer saber se você já sentiu a dor. Ele está ouvindo pelo fato de que não existe assinatura parcial, e por mitigações práticas em vez de uma regra geral contra context. Mencionar useSyncExternalStore ou uma biblioteca de store pequena mostra que você sabe o ponto em que context deixa de ser a ferramenta certa.
Como estruturar sua resposta
- Enuncie a regra: qualquer mudança de valor re-renderiza todos os consumidores.
- Explique o porquê, não há seletor e a comparação é por referência.
- Liste os consertos em ordem: memoizar, separar, depois migrar para uma store.
- Diga em que context é genuinamente bom, como configuração estável.
Exemplo de resposta
Context é primeiro um mecanismo de injeção de dependência e um gerenciador de estado num distante segundo lugar. O problema de performance é que os consumidores assinam o valor inteiro, então quando o value do provider muda de identidade, todo consumidor abaixo dele renderiza, até um que só lê um booleano. A primeira coisa que eu checo é se o provider está construindo um objeto novo inline no JSX, porque isso é uma referência nova a cada render do pai e anula tudo. Depois disso eu separo os contexts, porque normalmente os dados mudam com frequência e os setters nunca mudam, então colocar o dispatch no próprio context corta a maior parte da agitação. Se eu ainda preciso de seletores, eu paro de fingir que context é uma store e coloco o estado numa store de verdade, aí assino com useSyncExternalStore ou uma biblioteca para cada componente pegar a fatia dele. Onde context continua excelente é em coisas estáveis: tema, usuário atual, um locale, uma instância de client. Essas mudam quase nunca, então o custo de re-render é irrelevante.
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 o useSyncExternalStore evita o problema de re-render?
- O que acontece com providers aninhados do mesmo context?
- Você usaria context para estado de formulário? Por que não?
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