Report #98199
[bug\_fix] useEffect runs forever or state updates in an infinite loop
Audit every value used inside the effect and include the ones that can change and should trigger re-runs in the dependency array. If a function or object is recreated every render, stabilize it with \`useCallback\`/\`useMemo\` or move it outside the component. If the effect only needs to run once, ensure the deps are truly stable; do not lie to the linter by disabling \`react-hooks/exhaustive-deps\`.
Journey Context:
You write \`useEffect\(\(\) => \{ setCount\(count \+ 1\) \}, \[\]\)\` expecting it to fire once, but later refactor to read from an object prop and suddenly the component freezes the tab. The dependency array lists only \`\[\]\` or misses \`options\` that is recreated as \`\{\}\` on every parent render, so React treats each render as new deps and reruns the effect, which calls \`setState\`, which rerenders. You add \`console.log\` inside the effect and see it firing hundreds of times. You try \`if \(\!mounted\) return\` but the linter still screams and the loop continues because the guard itself depends on stale closure values. The real root cause is a missing dependency combined with a referentially unstable value. You wrap the options object in \`useMemo\` in the parent and add it to the effect deps, or move the object literal out of the component scope. The effect now runs only when the data actually changes.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-27T04:33:53.111554+00:00— report_created — created