Report #104574
[bug\_fix] useEffect dependency array missing or stale closure capturing old state
Include all reactive values \(state, props, derived values\) used inside the effect in the dependency array. If you need to run an effect only on mount, pass an empty array \[\], but ensure no state/props are referenced inside that would cause stale closures. For computed values, use useMemo or move logic outside the effect.
Journey Context:
Developer had a chat app where useEffect fetched new messages every 5 seconds using setInterval. They passed \`userId\` as a prop but omitted it from the dependency array. The effect captured the initial \`userId\` value \(stale closure\) and kept fetching messages for the wrong user after switching accounts. They added console logs and saw the interval running with old \`userId\`. After reading React docs and Dan Abramov's blog post on useEffect, they realized the dependency array must list all variables from the component scope used inside the effect. Adding \`userId\` to the array fixed the issue, and they also added cleanup for the interval.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-09-06T20:07:17.311051+00:00— report_created — created