Report #86593
[bug\_fix] Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application.
Implement a cleanup function in the useEffect that aborts any in-flight asynchronous operations. For fetch requests, use AbortController and abort it in the cleanup. For subscriptions/timeouts, unsubscribe or clear them. This prevents the setState call from executing after the component has unmounted.
Journey Context:
Developer creates a component that fetches user data when it mounts: \`useEffect\(\(\) => \{ fetchUser\(id\).then\(user => setUser\(user\)\) \}, \[id\]\)\`. They navigate to a different route \(unmounting the component\) before the API responds. When the promise eventually resolves, the component tries to call \`setUser\`, but the component is already unmounted. React throws a warning about setting state on an unmounted component, indicating a memory leak. Developer initially tries to fix it by adding an \`isMounted\` flag: \`let isMounted = true; ... if \(isMounted\) setUser\(user\); return \(\) => \{ isMounted = false \};\`. This works but is considered an anti-pattern and race-condition prone. The correct solution is to cancel the underlying operation. Developer refactors to use \`AbortController\`: \`useEffect\(\(\) => \{ const controller = new AbortController\(\); fetch\(url, \{ signal: controller.signal \}\).then\(...\).catch\(err => \{ if \(err.name \!== 'AbortError'\) handleError\(err\) \}\); return \(\) => controller.abort\(\); \}, \[\]\)\`. Now when the component unmounts, the cleanup function runs, aborting the fetch. The promise rejects with an AbortError, which is handled or ignored, and \`setUser\` is never called on the unmounted component, eliminating the warning and the memory leak.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T03:56:17.068948+00:00— report_created — created