From ff5386ce1b1dd70e4adc53efabe345e226c0a24c Mon Sep 17 00:00:00 2001 From: Sebastian Silbermann Date: Sun, 29 Mar 2020 20:05:14 +0200 Subject: [PATCH 1/2] test(SuspenseList): Add failing test for class component --- .../ReactSuspenseList-test.internal.js | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/packages/react-reconciler/src/__tests__/ReactSuspenseList-test.internal.js b/packages/react-reconciler/src/__tests__/ReactSuspenseList-test.internal.js index c13c31144828..572f0f8518e8 100644 --- a/packages/react-reconciler/src/__tests__/ReactSuspenseList-test.internal.js +++ b/packages/react-reconciler/src/__tests__/ReactSuspenseList-test.internal.js @@ -2485,4 +2485,66 @@ describe('ReactSuspenseList', () => { , ); }); + + it('can resume class components when revealed together', async () => { + let A = createAsyncText('A'); + let B = createAsyncText('B'); + + class ClassComponent extends React.Component { + render() { + return this.props.children; + } + } + + function Foo() { + return ( + }> + + + }> + + + + + }> + + + + + + ); + } + + await A.resolve(); + + ReactNoop.render(); + + expect(Scheduler).toFlushAndYield([ + 'A', + 'Suspend! [B]', + 'Loading B', + 'Loading A', + 'Loading B', + ]); + + expect(ReactNoop).toMatchRenderedOutput( + <> + Loading A + Loading B + , + ); + + await B.resolve(); + + ReactNoop.render(); + + expect(Scheduler).toFlushAndYield(['A', 'B']); + + expect(ReactNoop).toMatchRenderedOutput( + <> + A + B + , + ); + }); }); From 40891763a2f13f9b6796625f8f1b14b4c03bd991 Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Tue, 31 Mar 2020 13:37:29 -0700 Subject: [PATCH 2/2] Reset stateNode when resetWorkInProgress This is supposed to put the Fiber into the same state as if it was just created by child fiber reconciliation. For newly created fibers, that means that stateNode is null. --- packages/react-reconciler/src/ReactFiber.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react-reconciler/src/ReactFiber.js b/packages/react-reconciler/src/ReactFiber.js index f84d7796c99b..ea41e2b10e82 100644 --- a/packages/react-reconciler/src/ReactFiber.js +++ b/packages/react-reconciler/src/ReactFiber.js @@ -542,6 +542,8 @@ export function resetWorkInProgress( workInProgress.dependencies = null; + workInProgress.stateNode = null; + if (enableProfilerTimer) { // Note: We don't reset the actualTime counts. It's useful to accumulate // actual time across multiple render passes.