Evitare layout thrashing e sfarfallii visivi
Individuare quando useEffect causa uno sfarfallio visibile e sostituirlo con useLayoutEffect per risolverlo
Evitare layout thrashing e sfarfallii visivi è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 4 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.
Che cos'è il layout thrashing
Il layout thrashing si verifica quando JavaScript alterna la lettura delle proprietà del DOM e la scrittura nel DOM all'interno di un ciclo. Ogni lettura successiva a una scrittura forza il browser a ricalcolare il layout in modo sincrono per restituire un valore accurato. Questo può trasformare un singolo calcolo del layout in decine di calcoli, danneggiando gravemente le prestazioni.
Come il batching degli aggiornamenti aiuta React
React raggruppa tutte le chiamate a setState eseguite nei gestori degli eventi e negli effetti in un unico nuovo rendering. Questo batching naturale impedisce il pattern lettura-scrittura-lettura che causa il thrashing all'interno di un singolo ciclo di rendering. In React 18, il batching si estende anche alle callback asincrone e alle Promise, riducendo il layout thrashing causato dagli aggiornamenti di stato concorrenti.
Quando si verifica lo sfarfallio in useEffect
Lo sfarfallio si verifica quando un useEffect legge il DOM, aggiorna lo stato, attiva un nuovo rendering e il browser esegue il paint due volte: una volta con lo stato iniziale e una volta con quello corretto. Il primo paint appare brevemente prima di essere sostituito. Il fenomeno è più evidente negli effetti che modificano proprietà di layout come altezza, larghezza o posizione.
Diagnosi dello sfarfallio con DevTools
Apra Chrome DevTools, acceda alla scheda Rendering tramite il menu con i tre puntini, nella sezione Altri strumenti, e abiliti "Paint flashing". Le aree che vengono ridisegnate vengono evidenziate in verde. Se vede un componente sfarfallare al primo rendering e poi ridisegnarsi immediatamente con un layout diverso, ciò conferma la presenza di un doppio paint causato da un aggiornamento dello stato gestito da useEffect.
Correzione dello sfarfallio spostando il codice in useLayoutEffect
Sposti le letture del DOM e i conseguenti aggiornamenti dello stato da useEffect a useLayoutEffect. La stessa misurazione e lo stesso aggiornamento dello stato avvengono ora in modo sincrono prima del paint; React esegue nuovamente il rendering e il commit nello stesso passaggio, quindi il browser esegue il paint solo dello stato finale corretto. Lo sfarfallio verde in DevTools scompare.
Il pattern del singolo paint
Il pattern per evitare lo sfarfallio è il seguente: leggere il DOM in useLayoutEffect, chiamare setState con la misurazione, eseguire nuovamente il rendering in modo sincrono, applicare tramite commit il DOM corretto e lasciare che il browser esegua un solo paint con il risultato finale. Questo è il pattern standard per il posizionamento dei tooltip, gli offset delle intestazioni sticky e la configurazione delle animazioni.
Casi d'uso appropriati di useEffect
La grande maggioranza degli effetti deve essere inserita in useEffect: recupero dei dati (lo sfarfallio durante il caricamento è accettabile e previsto), sottoscrizioni a eventi o stream, logging e analisi, timer e qualsiasi effetto che non influisca immediatamente sul layout visibile. Usare useLayoutEffect anche quando sarebbe sufficiente useEffect è un anti-pattern che penalizza le prestazioni.
Casi d'uso appropriati di useLayoutEffect
Riservi useLayoutEffect alle misurazioni del DOM che influiscono sull'output visivo: posizioni dei tooltip, logica basata sulle dimensioni degli elementi, ripristino della posizione di scorrimento e configurazione di animazioni che leggono le dimensioni iniziali. Un sintomo evidente che indica la necessità di passare a questo hook è la comparsa di uno sfarfallio visibile, della durata di un frame, con un layout errato al primo rendering.
Confronto tra useEffect e useLayoutEffect nel codice
I due hook hanno firme identiche: useLayoutEffect(callback, deps) e useEffect(callback, deps). L'unica differenza riguarda il momento in cui viene eseguito il callback. Nel codice è possibile passare dall'uno all'altro modificando una sola parola. Inizi con useEffect e passi a useLayoutEffect solo dopo aver confermato la presenza dello sfarfallio.
Uso combinato dei due hook nello stesso componente
È valido e comune usare entrambi gli hook nello stesso componente per gestire responsabilità diverse. Per esempio, un componente che visualizza un grafico può usare useLayoutEffect per misurare la larghezza del contenitore e impostare il viewBox SVG in modo sincrono, quindi usare useEffect per recuperare asincronamente i dati del grafico. Ogni hook gestisce la responsabilità per la quale la tempistica è importante.
Verifica del doppio paint
Oltre alla visualizzazione dei paint in DevTools, è possibile aggiungere un contatore nella console all'interno del componente per contare i rendering. Se un componente registra "render" due volte al primo montaggio, una volta con lo stato iniziale e una volta con la misurazione corretta, si è in presenza di uno scenario con doppio paint. Spostando la misurazione in useLayoutEffect, dopo il montaggio dovrebbe essere registrato un solo rendering (a eccezione del doppio rendering dovuto a Strict Mode).
Quando preferire useLayoutEffect a useEffect
Quale scenario rappresenta il motivo corretto per usare useLayoutEffect invece di useEffect?
Riepilogo della lezione: layout thrash e sfarfallio visivo
Il layout thrash deriva dall'alternanza tra letture e scritture del DOM. Il batching di React ne previene la maggior parte durante i rendering. Lo sfarfallio si verifica quando useEffect misura il DOM e aggiorna lo stato, causando due paint. Per correggere lo sfarfallio, sposti le misurazioni del DOM in useLayoutEffect. Per tutto il resto, usi useEffect per impostazione predefinita: recupero dei dati, sottoscrizioni, logging e timer.
Domande Frequenti
La lezione «Evitare layout thrashing e sfarfallii visivi» è gratuita?
Sì — il testo completo di «Evitare layout thrashing e sfarfallii visivi» è 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 «Evitare layout thrashing e sfarfallii visivi»?
Individuare quando useEffect causa uno sfarfallio visibile e sostituirlo con useLayoutEffect per risolverlo 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 4 di 4.
Quanto tempo richiede la lezione «Evitare layout thrashing e sfarfallii visivi»?
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
- La fase di rendering e il commit nel DOM
- Quando viene eseguito useLayoutEffect rispetto a useEffect
- Misurare gli elementi del DOM con useLayoutEffect
- Evitare layout thrashing e sfarfallii visivi