useUpdateEffect
React effect hook that ignores the first invocation (e.g. on mount). The signature is exactly the same as the useEffect hook
useUpdateEffect works identically to useEffect except that it skips the initial execution on mount. The effect only fires on subsequent dependency changes, making it useful when you want to react to updates but not to the initial render. It uses useFirstMountState internally to detect and skip the first invocation.
When to Use
- Running a side effect only when a value changes after the initial render (e.g., syncing a form field to an API only on updates, not on mount)
- Showing a “value changed” notification without triggering it when the component first appears
- Skipping initial data fetches when the component already has default or cached data
Notes
- Same signature: Accepts an effect callback and optional dependency array, identical to
useEffect. Supports cleanup functions via the return value. - First-mount detection: Uses
useFirstMountStateinternally, which tracks mount status via a ref. - See also
useUpdateLayoutEffectfor the same skip-first-run behavior usinguseLayoutEffecttiming, anduseDeepCompareEffectfor deep dependency comparison.
Usage
Live Editor
function Demo() { const [count, setCount] = useState(0); const [effectCount, setEffectCount] = useState(0); const [updateEffectCount, setUpdateEffectCount] = useState(0); useEffect(() => { setEffectCount(c => c + 1); }, [count]); useUpdateEffect(() => { setUpdateEffectCount(c => c + 1); return () => { // do something }; }, [count]); // you can include deps array if necessary return ( <div> <p>effectCount: {effectCount}</p> <p>updateEffectCount: {updateEffectCount}</p> <p> <button type="button" onClick={() => setCount(c => c + 1)}> reRender </button> </p> </div> ); };
Result