Report #83086
[bug\_fix] React Hook useEffect has a missing dependency: 'someFunction'. Either include it or remove the dependency array. Or: Maximum update depth exceeded \(infinite loop\)
Include all reactive values \(props, state, functions\) used inside useEffect in the dependency array. If including a function causes infinite loops because the function reference changes every render, wrap the function definition in useCallback or move the function inside useEffect. For objects/arrays, use primitive dependencies or memoize them. The root cause is that React uses the dependency array to determine when to re-run the effect; missing deps cause stale closures, while unstable references cause unnecessary or infinite executions.
Journey Context:
Developer writes a search component with useEffect that calls onSearch prop when query changes. They write: useEffect\(\(\) => \{ onSearch\(query\); \}, \[query\]\);. ESLint warns about missing dependency 'onSearch'. They ignore it. Later, they notice that when the parent re-renders for unrelated state changes, the search effect doesn't use the latest onSearch callback, causing stale data to be passed up. They try fixing by adding onSearch to deps: useEffect\(\(\) => \{ onSearch\(query\); \}, \[query, onSearch\]\);. But onSearch is defined inline in parent: const onSearch = \(q\) => \{ ... setState\(q\) \};. This creates a new function reference every parent render, causing the effect to run infinitely \(Maximum update depth exceeded\). Developer spends 2 hours debugging, tries useRef to track previous values, tries throttling. Eventually they learn to wrap onSearch in useCallback in the parent: const onSearch = useCallback\(\(q\) => \{ ... \}, \[setState\]\);. Now the function reference is stable, they can safely include it in useEffect deps without infinite loops. They realize the ESLint rule react-hooks/exhaustive-deps is not just a suggestion but a correctness requirement.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T22:02:41.648520+00:00— report_created — created