Code Reference

useEffect vs useLayoutEffect

Comparisons · Reference cheat sheet

useEffect vs useLayoutEffect

Comparisons · Reference cheat sheet


📋 Overview

Both React hooks run after render from side-effect logic. useLayoutEffect fires synchronously after DOM mutations before paint; useEffect fires after paint. Prefer useEffect unless you must measure/mutate DOM before the user sees a frame.

🔧 Core concepts

DimensionuseEffectuseLayoutEffect
TimingAfter paintBefore paint (sync)
BlockingNon-blocking paintCan delay paint
SSROK (warns if misused)Warning on server — often gate
Typical useFetch, subscriptions, loggingDOM measure, scroll lock, tooltip position
Default choiceYesOnly when needed

When to use useEffect: data loading, event listeners, integrating non-React libs that can wait a frame.

When to use useLayoutEffect: avoid flicker when reading layout (getBoundingClientRect) and synchronously updating state/DOM.

💡 Examples

useEffect (fetch):

useEffect(() => {
  let cancelled = false;
  fetch("/api").then(async (r) => {
    const data = await r.json();
    if (!cancelled) setData(data);
  });
  return () => {
    cancelled = true;
  };
}, []);

useLayoutEffect (measure):

useLayoutEffect(() => {
  const rect = ref.current?.getBoundingClientRect();
  if (rect) setWidth(rect.width);
}, [deps]);

⚠️ Pitfalls

  • Putting heavy work in useLayoutEffect janks the UI.
  • useLayoutEffect on the server warns — use useEffect or client-only components.
  • Neither replaces data libraries (react-query) for complex fetching.

On this page