React useThrottle Hook: Throttle Values & Callbacks (2026)

A scroll listener fires at whatever rate the compositor feels like — often 60 times a second, sometimes 120. mousemove is worse. Feed either straight into setState and every wiggle of the wheel re-renders your component tree at frame rate; feed it into an analytics call or a network request and you've built a tiny DDoS against your own backend. Debouncing is the wrong fix here: a debounced scroll handler waits for the scrolling to stop, so your reading-progress bar freezes mid-scroll and jumps at the end. What you want is a steady cadence — run this at most once every N milliseconds, while the events keep coming. That's throttling.

useThrottle and useThrottleFn from @reactuses/core are that cadence as hooks — one for values, one for callbacks — built on lodash's battle-tested throttle and wrapped so the two classic React failure modes (stale closures, timers that outlive the component) can't happen. This post walks the real implementation, the leading/trailing knobs, the cancel/flush escape hatches, and one mount-timing subtlety the test suite pins down. TypeScript-first.

useThrottle — Throttle a Value

useThrottle takes a value that changes too fast and returns a copy that changes at a civilized pace: