From 65fb349d9e2cfbe106c0b301d5d500bd47bc49c0 Mon Sep 17 00:00:00 2001 From: Welkin Wong Date: Thu, 23 Oct 2025 15:48:48 +0800 Subject: [PATCH] fix(useTrackerSuspense): fix unmount error in StrictMode (dev only) --- .../suspense/useTracker.tests.js | 26 +++++++++++++++++++ .../react-meteor-data/suspense/useTracker.ts | 14 +++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/packages/react-meteor-data/suspense/useTracker.tests.js b/packages/react-meteor-data/suspense/useTracker.tests.js index e1c07c77..5a37f9ea 100644 --- a/packages/react-meteor-data/suspense/useTracker.tests.js +++ b/packages/react-meteor-data/suspense/useTracker.tests.js @@ -428,3 +428,29 @@ Meteor.isClient && ); } ); + +Meteor.isClient && + runForVariants( + 'suspense/useTracker - component unmount in Strict Mode', + async function (test, useTrackerFn) { + const { simpleFetch } = setupTest(); + + const Test = () => { + useTrackerFn('TestDocs', simpleFetch); + + return null; + }; + + const { queryByText, findByText, unmount } = render(, { + container: document.createElement('container'), + wrapper: TestSuspense, + reactStrictMode: true, + }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + unmount(); + + test.isTrue(true, 'should handle unmount correctly in Strict Mode'); + } + ); diff --git a/packages/react-meteor-data/suspense/useTracker.ts b/packages/react-meteor-data/suspense/useTracker.ts index 24b29620..9f6367f9 100644 --- a/packages/react-meteor-data/suspense/useTracker.ts +++ b/packages/react-meteor-data/suspense/useTracker.ts @@ -131,8 +131,11 @@ export function useTrackerSuspenseNoDeps(key: string, reactiveFn: IReac // stop the computation on unmount return () => { - refs.computation?.stop() - delete refs.computation + if (refs.computation) { + refs.computation.stop() + delete refs.computation + } + refs.isMounted = false } }, []) @@ -192,8 +195,11 @@ export const useTrackerSuspenseWithDeps = refs.isMounted = true return () => { - refs.computation.stop() - delete refs.computation + if (refs.computation) { + refs.computation.stop() + delete refs.computation + } + refs.isMounted = false } }, deps)