mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
Setting transition pending flag shouldn't be part of a surrounding transition (#26243)
Fixes #26226. (Is this the right fix?)
This commit is contained in:
+4
-4
@@ -2389,11 +2389,11 @@ function startTransition(
|
||||
higherEventPriority(previousPriority, ContinuousEventPriority),
|
||||
);
|
||||
|
||||
setPending(true);
|
||||
|
||||
const prevTransition = ReactCurrentBatchConfig.transition;
|
||||
ReactCurrentBatchConfig.transition = ({}: BatchConfigTransition);
|
||||
const currentTransition = ReactCurrentBatchConfig.transition;
|
||||
ReactCurrentBatchConfig.transition = null;
|
||||
setPending(true);
|
||||
const currentTransition = (ReactCurrentBatchConfig.transition =
|
||||
({}: BatchConfigTransition));
|
||||
|
||||
if (enableTransitionTracing) {
|
||||
if (options !== undefined && options.name !== undefined) {
|
||||
|
||||
@@ -951,4 +951,43 @@ describe('ReactTransition', () => {
|
||||
|
||||
expect(root).toMatchRenderedOutput('Transition pri: 1, Normal pri: 1');
|
||||
});
|
||||
|
||||
it('tracks two pending flags for nested startTransition (#26226)', async () => {
|
||||
let update;
|
||||
function App() {
|
||||
const [isPendingA, startTransitionA] = useTransition();
|
||||
const [isPendingB, startTransitionB] = useTransition();
|
||||
const [state, setState] = useState(0);
|
||||
|
||||
update = function () {
|
||||
startTransitionA(() => {
|
||||
startTransitionB(() => {
|
||||
setState(1);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<Text text={state} />
|
||||
{', '}
|
||||
<Text text={'A ' + isPendingA} />
|
||||
{', '}
|
||||
<Text text={'B ' + isPendingB} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
const root = ReactNoop.createRoot();
|
||||
await act(async () => {
|
||||
root.render(<App />);
|
||||
});
|
||||
assertLog([0, 'A false', 'B false']);
|
||||
expect(root).toMatchRenderedOutput('0, A false, B false');
|
||||
|
||||
await act(async () => {
|
||||
update();
|
||||
});
|
||||
assertLog([0, 'A true', 'B true', 1, 'A false', 'B false']);
|
||||
expect(root).toMatchRenderedOutput('1, A false, B false');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user