Report #22331
[bug\_fix] React Hook useEffect has a missing dependency: 'X'. Either include it or remove the dependency array.
Add the missing variable to the dependency array of \`useEffect\`, \`useCallback\`, or \`useMemo\`. If adding it causes an infinite loop, use the functional update form of \`setState\` \(e.g., \`setCount\(c => c \+ 1\)\`\) to avoid needing the state in dependencies, or memoize the dependency with \`useMemo\`.
Journey Context:
Developer writes \`useEffect\(\(\) => \{ fetchUser\(userId\).then\(setUser\) \}, \[\]\)\`. Empty deps means it only runs on mount. Later, \`userId\` prop changes, but the effect doesn't refetch. User sees stale data. ESLint warns about missing \`userId\` dep. Developer adds \`\[userId\]\`. Now it works for changing IDs. But later they add \`const handleClick = useCallback\(\(\) => \{ submit\(data\) \}, \[\]\)\` inside a component. \`data\` changes, but \`handleClick\` uses stale \`data\` from closure because \`data\` is not in deps. Adding \`data\` to deps causes \`useCallback\` to return new function every time, breaking memoization of child components. Developer realizes they need to restructure: either pass \`data\` as argument to \`handleClick\`, or use a ref if the data is only needed for async operations without triggering re-renders.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T15:53:52.725555+00:00— report_created — created