useEffect and useLayoutEffect both run side effects, but timing differs.
useEffect:
useLayoutEffect:
Code:
1import { useEffect, useLayoutEffect, useState } from "react";23function Component() {4 const [size, setSize] = useState({ width: 0, height: 0 });56 // ✅ useLayoutEffect — measure DOM before paint7 useLayoutEffect(() => {8 const { width, height } = document.getElementById("box")?.getBoundingClientRect() || {};9 setSize({ width, height });10 }, []);1112 // ❌ useEffect — causes flicker13 // useEffect(() => {14 // const { width, height } = document.getElementById("box")?.getBoundingClientRect() || {};15 // setSize({ width, height });16 // }, []);1718 return (19 <div id="box" style={{ width: 200, height: 100 }}>20 Size: {size.width} x {size.height}21 </div>22 );23}
When to use useLayoutEffect:
When to use useEffect:
Performance warning: