0Pricing
React Academy · Lezione

Quando viene eseguito useLayoutEffect rispetto a useEffect

Imparare che useLayoutEffect viene eseguito in modo sincrono dopo le mutazioni del DOM, ma prima del paint del browser

Quando viene eseguito useLayoutEffect rispetto a useEffect è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 2 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.

Tempistica di useLayoutEffect

useLayoutEffect viene eseguito in modo sincrono subito dopo che React ha applicato le mutazioni al DOM, ma prima che il browser abbia la possibilità di eseguire il paint di tali modifiche. Dal punto di vista del browser, l'effetto di layout e le mutazioni del DOM fanno parte dello stesso blocco di lavoro sincrono e ininterrotto.

Tempistica di useEffect

useEffect viene eseguito in modo asincrono dopo che il browser ha completato il paint. L'utente visualizza prima l'interfaccia aggiornata e poi viene eseguito l'effetto. Questo rende useEffect meno invasivo per le prestazioni del rendering, ma significa che qualsiasi modifica visibile causata dall'effetto comporterà un secondo ciclo di paint.

Esperimento con i timestamp

Può verificare la differenza di tempistica registrando i timestamp in entrambi gli effetti: aggiunga console.log('layout', Date.now()) in useLayoutEffect e console.log('passive', Date.now()) in useEffect. Nella console, il timestamp dell'effetto di layout sarà sempre precedente a quello dell'effetto passivo, confermando l'ordine di esecuzione.

Conseguenze visibili per gli utenti

Se un useEffect aggiorna lo stato che influisce sull'output visivo, l'utente vede due rendering: il rendering iniziale con lo stato obsoleto, seguito dal rendering corretto dopo l'esecuzione dell'effetto. Questo si manifesta come uno sfarfallio visibile o un ricalcolo del layout. useLayoutEffect lo impedisce perché i suoi aggiornamenti di stato vengono applicati prima che il browser esegua qualsiasi paint.

L'aggiornamento dello stato con useLayoutEffect causa un nuovo rendering sincrono

Se chiama setState all'interno di un useLayoutEffect, React esegue immediatamente un altro ciclo di rendering e commit prima del paint. Il browser esegue il paint solo del risultato finale: l'utente non vede mai lo stato intermedio. Questo è il principale caso d'uso di useLayoutEffect: misurare il DOM, calcolare un nuovo valore, aggiornare lo stato e garantire un unico paint senza artefatti.

Avvertenza sulle prestazioni

Poiché useLayoutEffect viene eseguito in modo sincrono prima del paint e può causare ulteriori rendering, un uso eccessivo può danneggiare le prestazioni. Se il lavoro sincrono è pesante, impedisce al browser di eseguire il paint, causando scatti visibili. Lo utilizzi solo quando deve impedire uno sfarfallio visivo; per tutto il resto usi useEffect.

Doppia invocazione in Strict Mode

In React Strict Mode, solo in sviluppo, sia useLayoutEffect sia useEffect vengono invocati due volte per ogni montaggio. La sequenza è: montaggio, pulizia, nuovo montaggio. Questo aiuta a individuare gli effetti che non eseguono correttamente la pulizia. La doppia invocazione non avviene nelle build di produzione.

Regola sulle prestazioni: usare useEffect come impostazione predefinita

La scelta predefinita dovrebbe essere sempre useEffect. Passi a useLayoutEffect solo quando può osservare e riprodurre uno sfarfallio visivo o un problema di layout errato. Un uso eccessivo di useLayoutEffect blocca inutilmente la pipeline di paint del browser e può ridurre le prestazioni percepite.

Avvertenza SSR: useLayoutEffect sul server

useLayoutEffect non può essere eseguito sul server perché in un ambiente server non esistono né il DOM né il ciclo di paint del browser. Se viene usato in un componente sottoposto a rendering sul server, React emette un avviso. La soluzione consiste nel saltare condizionalmente l'effetto: verifichi typeof window !== 'undefined' oppure passi a useEffect per il codice compatibile con SSR.

Come scegliere quale usare

Si chieda: "Questo effetto modifica qualcosa che l'utente vedrà già al primo paint?" Se la risposta è sì, usi useLayoutEffect per impedire uno sfarfallio. Se la risposta è no, ad esempio per il recupero di dati, le sottoscrizioni, l'analisi, la registrazione nei log e la maggior parte degli altri effetti collaterali, usi useEffect. Questo criterio copre la maggior parte dei casi reali.

La natura sincrona di useLayoutEffect

useLayoutEffect viene eseguito nello stesso blocco sincrono delle mutazioni del DOM. Mentre è in esecuzione un useLayoutEffect, React non può elaborare altro lavoro, come rispondere agli eventi dell'utente. Per questo deve essere rapido e mirato. Il codice sincrono di lunga durata in useLayoutEffect ritarda direttamente il rendering del browser sullo schermo.

Tempistica di useLayoutEffect

Quando viene eseguito esattamente useLayoutEffect rispetto alle mutazioni del DOM e al paint del browser?

Riepilogo della lezione: useLayoutEffect e useEffect a confronto

useLayoutEffect è sincrono e viene eseguito prima del paint del browser, quindi è adatto per misurare il DOM e correggere gli elementi visivi. useEffect viene eseguito dopo il paint ed è la scelta corretta per il recupero di dati, le sottoscrizioni e la maggior parte degli effetti collaterali. Usi useEffect come impostazione predefinita e passi a useLayoutEffect solo quando uno sfarfallio visivo conferma che è necessario. Eviti di usarlo in SSR senza opportune verifiche.

Domande Frequenti

La lezione «Quando viene eseguito useLayoutEffect rispetto a useEffect» è gratuita?

Sì — il testo completo di «Quando viene eseguito useLayoutEffect rispetto a useEffect» è 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 «Quando viene eseguito useLayoutEffect rispetto a useEffect»?

Imparare che useLayoutEffect viene eseguito in modo sincrono dopo le mutazioni del DOM, ma prima del paint del browser 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 2 di 4.

Quanto tempo richiede la lezione «Quando viene eseguito useLayoutEffect rispetto a useEffect»?

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