0Pricing
React Academy · Lezione

useLayoutEffect per le misurazioni pre-animazione

Usi useLayoutEffect per misurare le dimensioni degli elementi prima dell'inizio delle animazioni ed evitare spostamenti del layout.

useLayoutEffect per le misurazioni pre-animazione è 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.

Il problema del flash

A volte un elemento salta visibilmente o lampeggia al primo rendering prima di stabilizzarsi nella posizione corretta. Di solito accade quando si misura o si riposiziona un elemento dopo che il browser lo ha già disegnato.

L'utente vede la posizione errata per un frame, poi una correzione improvvisa, e il risultato sembra difettoso.

Perché useEffect causa il flash

useEffect viene eseguito dopo che il browser ha eseguito il paint. Quindi, se legge una misurazione e aggiorna il DOM all'interno di useEffect, l'utente ha già visto il frame non corretto prima che la modifica venga applicata.

Per il posizionamento visivo che deve risultare invisibile all'utente, l'esecuzione dopo il paint arriva troppo tardi.

useLayoutEffect viene eseguito prima del paint

useLayoutEffect viene eseguito in modo sincrono dopo che React ha modificato il DOM, ma prima che il browser esegua il paint. Qualsiasi lettura o scrittura del DOM eseguita lì viene applicata prima che l'utente veda anche un solo frame.

Per questo è lo strumento adatto per misurazioni e posizionamenti che devono apparire immediatamente corretti.

Misurare la posizione iniziale

All'interno di useLayoutEffect è possibile leggere il layout di un elemento con ref.current.getBoundingClientRect() per acquisirne la posizione e le dimensioni prima di animarlo.

Poiché viene eseguito prima del paint, è possibile sia misurare sia applicare una trasformazione iniziale senza alcun flash visibile.

La tecnica FLIP

FLIP è l'acronimo di First, Last, Invert, Play. Si registra la posizione First dell'elemento, lo si lascia spostare nella posizione Last, poi si applica una trasformazione Invert che lo riporta visivamente in First e infine si esegue Play rimuovendo la trasformazione, così anima fino a Last.

Questo consente di animare i cambiamenti di layout usando solo una transform poco costosa, anche se il layout reale è cambiato istantaneamente.

getBoundingClientRect in useLayoutEffect

Le letture chiave avvengono in useLayoutEffect: si acquisisce il rettangolo First prima della modifica e il rettangolo Last dopo, quindi si calcola lo scarto. Eseguire tutto prima del paint garantisce che la trasformazione invertita sia applicata prima che venga mostrato qualsiasi elemento.

La differenza tra i due rettangoli fornisce i valori esatti di traslazione e scala necessari per invertire il movimento.

Applicare la trasformazione in modo sincrono

Imposti la trasformazione di inversione in modo sincrono all'interno di useLayoutEffect, poi al frame successivo la rimuova affinché l'elemento animi fino alla sua posizione naturale. Spesso si attiva il passaggio Play con requestAnimationFrame.

Poiché l'inversione è stata applicata prima del paint, l'utente non vede mai l'elemento nella sua posizione Last grezza.

L'avvertenza SSR

Sul server non esiste il DOM, quindi React registra un'avvertenza secondo cui useLayoutEffect non esegue alcuna operazione durante il rendering lato server. Gli effetti di layout hanno senso solo nel browser.

Questa avvertenza indica che l'effetto non può essere eseguito dove non c'è nulla da misurare.

Alternativa compatibile con SSR

Se un componente deve essere eseguito sul server, utilizzi useEffect insieme a requestAnimationFrame per effettuare la misurazione prima del paint successivo, oppure utilizzi useLayoutEffect condizionalmente solo nel browser.

Questo evita l'avvertenza, pur consentendo di avvicinarsi alle tempistiche precedenti al paint per le animazioni non critiche.

Esempio di accordion espandibile

Un'animazione dell'altezza è un caso classico: in useLayoutEffect si misurano le altezze compressa ed espansa, quindi si anima tra valori espliciti in pixel affinché la transizione sia fluida.

Poiché l'altezza auto non è animabile, misurare prima l'altezza reale consente di passare a un valore concreto.

Quando usare useLayoutEffect

Per la maggior parte delle attività, scelga per impostazione predefinita useEffect. Utilizzi useLayoutEffect solo quando legge il layout e deve modificare il DOM prima del paint per evitare un flash visibile.

Un uso eccessivo può penalizzare le prestazioni perché blocca il paint finché non termina.

Verifica rapida

Verifichi la sua comprensione della tempistica degli effetti.

Riepilogo

Ha imparato che il problema del flash deriva dalla misurazione dopo il paint, che useLayoutEffect viene eseguito prima del paint e come la tecnica FLIP anima i cambiamenti di layout con trasformazioni poco costose.

Ha anche visto l'avvertenza SSR e un'alternativa con useEffect e requestAnimationFrame.

Domande Frequenti

La lezione «useLayoutEffect per le misurazioni pre-animazione» è gratuita?

Sì — il testo completo di «useLayoutEffect per le misurazioni pre-animazione» è 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 «useLayoutEffect per le misurazioni pre-animazione»?

Usi useLayoutEffect per misurare le dimensioni degli elementi prima dell'inizio delle animazioni ed evitare spostamenti del layout. 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 «useLayoutEffect per le misurazioni pre-animazione»?

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. Transizioni CSS con i cambiamenti di stato in React
  2. Animazioni CSS con keyframe in React
  3. useLayoutEffect per le misurazioni pre-animazione
  4. Animazioni di entrata e uscita senza librerie
← Torna a React Academy