Evitando sobrecarga de layout e tremulação visual
Identifique quando um useEffect causa tremulação visível e substitua-o por useLayoutEffect para corrigi-la.
Evitando sobrecarga de layout e tremulação visual é uma aula grátis de React Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.
O que é a instabilidade da disposição
A instabilidade da disposição ocorre quando o JavaScript alterna entre ler propriedades do DOM e escrever no DOM dentro de um loop. Cada leitura depois de uma escrita força o navegador a recalcular a disposição de forma síncrona para retornar um valor preciso. Isso pode transformar o que deveria ser um único cálculo de disposição em dezenas deles, prejudicando gravemente o desempenho.
Como o agrupamento de atualizações do React ajuda
React agrupa todas as chamadas de setState dentro de manipuladores de eventos e efeitos em uma única nova renderização. Esse agrupamento natural impede o padrão leitura-escrita-leitura que causa instabilidade dentro de um único ciclo de renderização. No React 18, o agrupamento também se estende a funções de retorno assíncronas e promessas, reduzindo a instabilidade da disposição causada por atualizações concorrentes de estado.
Quando ocorre a cintilação em useEffect
A cintilação ocorre quando um useEffect lê o DOM, atualiza o estado, dispara uma nova renderização e o navegador pinta duas vezes: uma com o estado inicial e outra com o estado corrigido. A primeira pintura aparece brevemente antes de ser substituída. Isso é mais visível em efeitos que ajustam propriedades do leiaute, como altura, largura ou posição.
Diagnosticando a cintilação com DevTools
Abra o Chrome DevTools, acesse a aba Renderização (pelo menu de três pontos em Mais ferramentas) e ative "Intermitência de pintura". As áreas repintadas são destacadas em verde. Se você vir um componente cintilar na primeira renderização e depois ser repintado imediatamente com um leiaute diferente, isso confirma uma dupla pintura causada por uma atualização de estado conduzida por useEffect.
Corrigindo a cintilação ao migrar para useLayoutEffect
Mova as leituras do DOM e as atualizações de estado resultantes de useEffect para useLayoutEffect. A mesma medição e atualização de estado agora acontecem de forma síncrona antes da pintura; o React renderiza novamente e confirma as alterações no mesmo bloco, e o navegador pinta apenas o estado final e correto. A intermitência verde no DevTools desaparece.
O padrão de pintura única
O padrão sem cintilação é: ler o DOM em useLayoutEffect, chamar setState com a medição, fazer o React renderizar novamente de forma síncrona, confirmar o DOM corrigido e deixar o navegador pintar uma vez com o resultado final. Esse é o padrão consagrado para posicionar dicas de ferramenta, calcular deslocamentos de cabeçalhos fixos e configurar animações.
Casos válidos de uso de useEffect
A grande maioria dos efeitos deve ficar em useEffect: busca de dados (a cintilação durante o carregamento é aceitável e esperada), assinaturas de eventos ou fluxos, registro de eventos e análise, temporizadores e qualquer efeito que não afete imediatamente o leiaute visível. Usar useLayoutEffect em excesso quando useEffect resolveria é um antipadrão que prejudica o desempenho.
Casos válidos de uso de useLayoutEffect
Reserve useLayoutEffect para medições do DOM que alimentam a saída visual: posições de dicas de ferramenta, lógica baseada no tamanho dos elementos, restauração da posição de rolagem e configuração de animações que lê as dimensões iniciais. Um sinal claro de que você deve fazer a troca é observar um clarão visível, de um único quadro, de um leiaute incorreto na primeira renderização.
Comparando useEffect e useLayoutEffect no código
Os dois ganchos têm assinaturas idênticas: useLayoutEffect(callback, deps) e useEffect(callback, deps). A única diferença é o momento em que a função de retorno de chamada é executada. Você pode alternar entre eles com uma alteração de uma palavra no código. Comece com useEffect e só mude para useLayoutEffect se confirmar a ocorrência de cintilação.
Combinando ambos em um componente
É válido e comum usar os dois ganchos no mesmo componente para responsabilidades diferentes. Por exemplo, um componente de gráfico pode usar useLayoutEffect para medir a largura do contêiner e definir o viewBox do SVG de forma síncrona, e depois usar useEffect para buscar os dados do gráfico de forma assíncrona. Cada gancho cuida do aspecto em que o momento de execução é importante.
Testando a dupla pintura
Além da intermitência de pintura do DevTools, você pode adicionar um contador no console dentro do componente para contar as renderizações. Se um componente registrar "render" duas vezes na primeira montagem — uma vez com o estado inicial e outra com a medição corrigida —, você terá um cenário de dupla pintura. Mover a medição para useLayoutEffect deve reduzir isso a uma única renderização registrada após a montagem (sem contar a duplicação em Strict Mode).
Quando preferir useLayoutEffect a useEffect
Qual cenário apresenta o motivo correto para usar useLayoutEffect em vez de useEffect?
Recapitulação da lição: instabilidade do leiaute e cintilação visual
A instabilidade do leiaute é causada pela alternância entre leituras e escritas no DOM. O processamento em lotes do React evita a maior parte disso durante as renderizações. A cintilação acontece quando useEffect mede o DOM e atualiza o estado, causando duas pinturas. Corrija a cintilação movendo as medições do DOM para useLayoutEffect. Use useEffect por padrão para todo o resto: busca de dados, assinaturas, registro de eventos e temporizadores.
Aprenda React com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 88
- Aulas
- 324
Perguntas Frequentes
A aula “Evitando sobrecarga de layout e tremulação visual” é grátis?
Sim — o texto completo de “Evitando sobrecarga de layout e tremulação visual” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.
O que vou aprender em “Evitando sobrecarga de layout e tremulação visual”?
Identifique quando um useEffect causa tremulação visível e substitua-o por useLayoutEffect para corrigi-la. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar React Academy?
Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Evitando sobrecarga de layout e tremulação visual”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de React Academy?
Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- A fase de renderização e o commit no DOM
- Quando useLayoutEffect é executado em comparação com useEffect
- Medindo elementos do DOM com useLayoutEffect
- Evitando sobrecarga de layout e tremulação visual