Entrambi eseguono effetti, ma in momenti diversi rispetto al disegno del browser — e questa differenza di tempismo è il punto centrale.
Entrambi eseguono effetti, ma in momenti diversi rispetto al disegno del browser — e questa differenza di tempismo è il punto centrale.
useEffect viene eseguito dopo che il browser ha disegnato. È asincrono e non bloccante. Usalo per quasi tutto (dati, sottoscrizioni, logging).useLayoutEffect viene eseguito sincrono dopo che il DOM è stato mutato ma PRIMA che il browser disegni. Usalo quando devi leggere il layout e modificare il DOM nello stesso frame per evitare uno sfarfallio visibile.render → DOM updated → [useLayoutEffect runs] → browser paints → [useEffect runs]
Immaginati di misurare un elemento e riposizionare un tooltip in base alle sue dimensioni. Con useEffect, l'utente vedrebbe brevemente il tooltip nel posto sbagliato, poi salta:
useLayoutEffect(() => {
const { height } = ref.current.getBoundingClientRect();
setTooltipTop(-height); // applied BEFORE paint → no visible jump
}, []);
Con useEffect, lo stesso codice viene eseguito dopo il disegno → uno sfarfallio di un frame.
useLayoutEffect rende l'UI scattante, perché il browser non può disegnare finché non finisce.Regola pratica: utilizza useEffect per impostazione predefinita; usa useLayoutEffect solo per misurazioni DOM/mutazioni sincrone che altrimenti sfoccherebbero.
Una raccolta di domande di colloquio IT con risposte dettagliate — da Junior a Senior.
Dona