Warning: State update from an outdated closure. The value you are accessing is stale.
ID: react/stale-closure-usestate
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| React 18.2.0 | active | — | — | — |
| React 19.0.0 | active | — | — | — |
Root Cause
A state setter or callback captures a stale closure value (e.g., from an event handler or setTimeout) that does not reflect the latest state, often due to missing dependency arrays in useEffect or useCallback.
generic中文
状态设置器或回调捕获了过时的闭包值(例如,来自事件处理程序或setTimeout),该值未反映最新状态,通常是由于useEffect或useCallback中缺少依赖项数组。
Official Documentation
https://react.dev/reference/react/useState#stale-closureWorkarounds
-
85% success Use the functional update form of setState: setCount(prev => prev + 1) instead of setCount(count + 1), and ensure all dependencies are listed in useEffect or useCallback dependency arrays.
Use the functional update form of setState: setCount(prev => prev + 1) instead of setCount(count + 1), and ensure all dependencies are listed in useEffect or useCallback dependency arrays.
-
80% success If using useCallback, include all state variables in the dependency array to ensure the callback is recreated when state changes.
If using useCallback, include all state variables in the dependency array to ensure the callback is recreated when state changes.
中文步骤
Use the functional update form of setState: setCount(prev => prev + 1) instead of setCount(count + 1), and ensure all dependencies are listed in useEffect or useCallback dependency arrays.
If using useCallback, include all state variables in the dependency array to ensure the callback is recreated when state changes.
Dead Ends
Common approaches that don't work:
-
Adding the state variable to the dependency array of useEffect without using functional update
60% fail
Adding the state variable may cause infinite re-renders if the effect updates state, and does not fix the closure if the callback is defined outside the effect.
-
Using a ref to store the state value and reading from ref in the closure
40% fail
This works but is often overcomplicated; many developers misuse refs by not syncing them properly, leading to stale ref values.
-
Ignoring the warning and assuming it's a false positive
90% fail
The warning indicates a real bug; ignoring it leads to unpredictable UI behavior and hard-to-debug state inconsistencies.