From fd23be0e2b9ea6d4d569a8e236fb05ac8cd2aec0 Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Mon, 12 May 2025 22:30:52 -0400 Subject: [PATCH] Always flush Default priority in the microtask if a Transition was scheduled too --- packages/react-reconciler/src/ReactFiberRootScheduler.js | 8 ++++++++ .../src/__tests__/ReactDefaultTransitionIndicator-test.js | 5 +---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberRootScheduler.js b/packages/react-reconciler/src/ReactFiberRootScheduler.js index 7daed077eee..0bcf1d580c6 100644 --- a/packages/react-reconciler/src/ReactFiberRootScheduler.js +++ b/packages/react-reconciler/src/ReactFiberRootScheduler.js @@ -26,6 +26,7 @@ import { NoLane, NoLanes, SyncLane, + DefaultLane, getHighestPriorityLane, getNextLanes, includesSyncLane, @@ -261,6 +262,13 @@ function processRootScheduleInMicrotask() { // render it synchronously anyway. We do this during a popstate event to // preserve the scroll position of the previous page. syncTransitionLanes = currentEventTransitionLane; + } else if (enableDefaultTransitionIndicator) { + // If we have a Transition scheduled by this event it might be paired + // with Default lane scheduled loading indicators. To unbatch it from + // other events later on, flush it early to determine whether it + // rendered an indicator. This ensures that setState in default priority + // event doesn't trigger onDefaultTransitionIndicator. + syncTransitionLanes = DefaultLane; } } diff --git a/packages/react-reconciler/src/__tests__/ReactDefaultTransitionIndicator-test.js b/packages/react-reconciler/src/__tests__/ReactDefaultTransitionIndicator-test.js index bc5c3ec6695..71848056034 100644 --- a/packages/react-reconciler/src/__tests__/ReactDefaultTransitionIndicator-test.js +++ b/packages/react-reconciler/src/__tests__/ReactDefaultTransitionIndicator-test.js @@ -109,10 +109,7 @@ describe('ReactDefaultTransitionIndicator', () => { expect(root).toMatchRenderedOutput(
Hi
); await act(() => { - // TODO: This should not require a discrete update ideally but work for default too. - ReactNoop.discreteUpdates(() => { - update('Loading...'); - }); + update('Loading...'); React.startTransition(() => { update(''); root.render({promiseB});