0Pricing
React Academy · Lezione

Misurare gli elementi del DOM con useLayoutEffect

Leggere dimensioni, posizioni e offset di scorrimento degli elementi dopo il layout ma prima del paint, per evitare sfarfallii

Misurare gli elementi del DOM con useLayoutEffect è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.

Panoramica di getBoundingClientRect

element.getBoundingClientRect() restituisce un oggetto DOMRect con le dimensioni e la posizione dell'elemento rispetto al viewport: top, right, bottom, left, width e height. Per restituire valori accurati, forza il browser a eseguire un calcolo del layout, quindi lo chiami con parsimonia.

Il problema della lettura in useEffect

Se legge getBoundingClientRect() in un useEffect, il browser ha già eseguito il paint. Se poi aggiorna lo stato in base alla misurazione, React esegue un nuovo rendering e il browser esegue un altro paint. Gli utenti potrebbero vedere brevemente l'elemento nella posizione o con le dimensioni errate prima che la correzione compaia nel secondo paint.

Perché useLayoutEffect risolve il problema

La lettura delle misurazioni in useLayoutEffect avviene dopo le mutazioni del DOM ma prima del paint. Qualsiasi aggiornamento dello stato attivato dalla misurazione fa sì che React esegua nuovamente il rendering in modo sincrono e applichi il DOM corretto, tutto prima che il browser abbia eseguito il paint. L'utente vede solo il risultato finale corretto in un unico ciclo di paint.

Posizionamento del tooltip

Un tooltip deve apparire vicino all'elemento che lo attiva. Misuri la posizione dell'elemento attivatore in useLayoutEffect usando getBoundingClientRect(), calcoli la posizione assoluta del tooltip e imposti tale posizione nello stato. Il tooltip viene visualizzato nella posizione corretta già al primo paint, senza alcun salto visibile dalla posizione iniziale errata.

Animazione di un elemento: lettura delle dimensioni iniziali

Per animare un elemento dalla sua dimensione naturale, non vincolata, a una dimensione fissa, deve conoscere la dimensione naturale prima di applicare il vincolo. Legga l'altezza dell'elemento in useLayoutEffect prima di applicare qualsiasi stile di animazione, la memorizzi nello stato e poi la usi come valore del fotogramma chiave iniziale per la transizione CSS.

Altezza dell'header sticky

Quando una pagina ha un header sticky, il contenuto della pagina deve avere un padding superiore uguale all'altezza dell'header per evitare che venga nascosto dietro di esso. Misuri l'altezza dell'header in useLayoutEffect usando un ref: headerRef.current.getBoundingClientRect().height. Imposti questo valore come paddingTop sul contenitore del contenuto. Il layout è corretto già dal primo rendering.

L'aggiornamento dello stato causa un nuovo rendering sincrono

Quando chiama setState all'interno di useLayoutEffect, React esegue immediatamente un altro ciclo di rendering e commit nello stesso blocco sincrono. Anche questo nuovo rendering esegue il relativo useLayoutEffect. Faccia attenzione a non creare un ciclo infinito: aggiorni lo stato solo se la nuova misurazione è diversa dal valore attuale nello stato.

SSR: le misurazioni restituiscono zero

Sul server gli elementi del DOM non esistono, quindi getBoundingClientRect() causerebbe un errore o restituirebbe zero. Protegga il suo useLayoutEffect con un controllo: if (typeof window === 'undefined') return;. Nelle app SSR potrebbe essere necessario eseguire l'hydration con una dimensione segnaposto e misurare dopo l'hydration sul client.

ResizeObserver per il monitoraggio continuo

Una misurazione una tantum con useLayoutEffect fornisce le dimensioni al momento del montaggio. Per monitorare le variazioni delle dimensioni mentre l'elemento cambia dimensione, a causa del ridimensionamento della finestra, del contenuto dinamico o delle modifiche CSS, usi invece ResizeObserver. Questo esegue una callback ogni volta che cambiano le dimensioni dell'elemento, risultando più adatto ai componenti responsivi.

Evitare misurazioni ridondanti

Se più effetti hanno bisogno della stessa misurazione, la calcoli una sola volta e la condivida tramite il context oppure la passi tramite props. Calcolare lo stesso valore di getBoundingClientRect() in più chiamate a useLayoutEffect attiva più letture sincrone del layout, ciascuna relativamente costosa. Quando possibile, raggruppi le misurazioni.

Tempistica dei ref con useLayoutEffect

I ref vengono valorizzati prima dell'esecuzione degli effetti. Quando viene eseguito useLayoutEffect, ref.current punta sicuramente all'elemento del DOM. È per questo che il pattern funziona: useLayoutEffect(() => { const rect = ref.current.getBoundingClientRect(); ... }, []). In un componente montato, il ref non è mai null all'interno di un effetto di layout.

Tempistica di getBoundingClientRect

Perché è meglio chiamare getBoundingClientRect() in useLayoutEffect invece che in useEffect?

Riepilogo della lezione: misurazione degli elementi del DOM

Usi getBoundingClientRect() in useLayoutEffect per leggere le misurazioni del DOM dopo le mutazioni ma prima del paint. Gli aggiornamenti dello stato derivanti da queste misurazioni causano un nuovo rendering sincrono incluso nello stesso paint, impedendo lo sfarfallio. Gestisca l'SSR con un controllo su typeof window. Per monitorare continuamente le dimensioni, preferisca ResizeObserver.

Domande Frequenti

La lezione «Misurare gli elementi del DOM con useLayoutEffect» è gratuita?

Sì — il testo completo di «Misurare gli elementi del DOM con useLayoutEffect» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.

Cosa imparerò in «Misurare gli elementi del DOM con useLayoutEffect»?

Leggere dimensioni, posizioni e offset di scorrimento degli elementi dopo il layout ma prima del paint, per evitare sfarfallii Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare React Academy?

Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Misurare gli elementi del DOM con useLayoutEffect»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione React Academy?

Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. La fase di rendering e il commit nel DOM
  2. Quando viene eseguito useLayoutEffect rispetto a useEffect
  3. Misurare gli elementi del DOM con useLayoutEffect
  4. Evitare layout thrashing e sfarfallii visivi
← Torna a React Academy