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. 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 + , + ); + }); });