React useUpdateEffect Hook: Skip the First Render (2026)
useEffect has no opinion about why it's running. Mount, update, doesn't matter — the callback fires either way. Which is how a "settings saved ✓" toast greets users the moment the page loads, an autosave POSTs a form nobody has touched yet, and an analytics event reports a "change" that was actually just the component appearing. What you meant was run this when the value changes; what you wrote was run this when the value changes, and also once at the start for no reason.
useUpdateEffect from @reactuses/core is useEffect minus the mount run: identical signature, identical cleanup semantics, skips exactly one invocation. The implementation is four lines, so this post covers what those four lines do, the one place the abstraction genuinely leaks — React 18 StrictMode, where we'll prove with a test that the callback does fire on mount in development — and the neighboring hooks people confuse it with. TypeScript-first.
The Hand-Rolled Guard
There's no mystery about how to skip a mount run — every React codebase past a certain age contains this:






