0Pricing
React Academy · Aula

Medindo elementos do DOM com useLayoutEffect

Leia dimensões, posições e deslocamentos de rolagem dos elementos após o layout, mas antes da pintura, para evitar tremulações.

Medindo elementos do DOM com useLayoutEffect é uma aula grátis de React Academy no CoddyKit. Esta é a aula 3 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.

Visão geral de getBoundingClientRect

element.getBoundingClientRect() retorna um objeto DOMRect com o tamanho e a posição do elemento em relação à área visível: top, right, bottom, left, width e height. Para retornar valores precisos, ele força o navegador a calcular a disposição dos elementos, portanto chame-o com moderação.

O problema de ler em useEffect

Se você ler getBoundingClientRect() em um useEffect, o navegador já terá pintado a tela. Se você então atualizar o estado com base nessa medição, React renderizará novamente e o navegador pintará outra vez. Os usuários poderão ver o elemento brevemente na posição ou com o tamanho incorreto antes que a correção apareça na segunda pintura.

Por que useLayoutEffect resolve esse problema

A leitura das medidas em useLayoutEffect ocorre depois das mutações do DOM, mas antes da pintura. Qualquer atualização de estado provocada pela medição fará React renderizar novamente de forma síncrona e confirmar o DOM corrigido — tudo antes que o navegador pinte qualquer coisa. O usuário verá somente o resultado final e correto em um único ciclo de pintura.

Posicionamento de dicas de ferramenta

Uma dica de ferramenta precisa aparecer perto do elemento que a aciona. Meça a posição desse elemento em useLayoutEffect usando getBoundingClientRect(), calcule a posição absoluta da dica de ferramenta e armazene essa posição no estado. A dica de ferramenta será renderizada no local correto já na primeira pintura, sem um salto visível a partir de uma posição inicial incorreta.

Animação de elementos: leitura do tamanho inicial

Para animar um elemento de seu tamanho natural, sem restrições, até um tamanho fixo, você precisa conhecer o tamanho natural antes de aplicar a restrição. Leia a altura do elemento em useLayoutEffect antes que qualquer estilo de animação seja aplicado, armazene-a no estado e use-a como valor do quadro-chave inicial para sua transição do CSS.

Altura do cabeçalho fixo

Quando uma página tem um cabeçalho fixo, o conteúdo da página precisa de um preenchimento superior igual à altura do cabeçalho para não ficar oculto atrás dele. Meça a altura do cabeçalho em useLayoutEffect usando uma referência: headerRef.current.getBoundingClientRect().height. Defina esse valor como paddingTop no contêiner de conteúdo. A disposição estará correta desde a primeira renderização.

A atualização de estado causa uma nova renderização síncrona

Quando você chama setState dentro de useLayoutEffect, React executa imediatamente outro ciclo de renderização e confirmação no mesmo bloco síncrono. Essa nova renderização também executa seu useLayoutEffect. Tenha cuidado para não criar um loop infinito: atualize o estado somente se a nova medição for diferente do valor atual do estado.

SSR: as medições retornam zero

No servidor, os elementos do DOM não existem, portanto getBoundingClientRect() causaria um erro ou retornaria zeros. Proteja seu useLayoutEffect com uma verificação: if (typeof window === 'undefined') return;. Em aplicações com SSR, talvez seja necessário hidratar a aplicação com um tamanho de espaço reservado e medir depois da hidratação no cliente.

ResizeObserver para acompanhamento contínuo

Uma medição única com useLayoutEffect fornece o tamanho no momento da montagem. Para acompanhar mudanças de tamanho conforme o elemento é redimensionado, devido ao redimensionamento da janela, ao conteúdo dinâmico ou a alterações no CSS, use ResizeObserver. Ele executa uma função de retorno sempre que o tamanho do elemento muda, sendo mais adequado para componentes responsivos.

Como evitar medições redundantes

Se vários efeitos precisarem da mesma medição, calcule-a uma vez e compartilhe-a por meio de um contexto ou passando-a como propriedades. Calcular o mesmo valor de getBoundingClientRect() em várias chamadas de useLayoutEffect dispara várias leituras síncronas da disposição, cada uma relativamente custosa. Sempre que possível, agrupe as medições.

Temporização das referências com useLayoutEffect

As referências são preenchidas antes da execução dos efeitos. Quando useLayoutEffect é executado, há garantia de que ref.current aponta para o elemento do DOM. É por isso que o padrão funciona: useLayoutEffect(() => { const rect = ref.current.getBoundingClientRect(); ... }, []). A referência nunca é nula dentro de um efeito de disposição em um componente montado.

Temporização de getBoundingClientRect

Por que é melhor chamar getBoundingClientRect() em useLayoutEffect do que em useEffect?

Recapitulação da lição: medição de elementos do DOM

Use getBoundingClientRect() em useLayoutEffect para ler as medidas do DOM depois das mutações, mas antes da pintura. As atualizações de estado provenientes dessas medições causam uma nova renderização síncrona incluída na mesma pintura, evitando cintilações. Proteja-se contra SSR com uma verificação de typeof window. Para acompanhar o tamanho continuamente, prefira ResizeObserver.

Perguntas Frequentes

A aula “Medindo elementos do DOM com useLayoutEffect” é grátis?

Sim — o texto completo de “Medindo elementos do DOM com useLayoutEffect” é 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 “Medindo elementos do DOM com useLayoutEffect”?

Leia dimensões, posições e deslocamentos de rolagem dos elementos após o layout, mas antes da pintura, para evitar tremulações. 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 3 de 4.

Quanto tempo leva a aula “Medindo elementos do DOM com useLayoutEffect”?

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

  1. A fase de renderização e o commit no DOM
  2. Quando useLayoutEffect é executado em comparação com useEffect
  3. Medindo elementos do DOM com useLayoutEffect
  4. Evitando sobrecarga de layout e tremulação visual
← Voltar para React Academy