diff --git a/packages/react-dom/src/__tests__/ReactErrorBoundaries-test.js b/packages/react-dom/src/__tests__/ReactErrorBoundaries-test.js index 01b2b33f34..266e196ba8 100644 --- a/packages/react-dom/src/__tests__/ReactErrorBoundaries-test.js +++ b/packages/react-dom/src/__tests__/ReactErrorBoundaries-test.js @@ -2001,4 +2001,16 @@ describe('ReactErrorBoundaries', () => { // Error should be the first thrown expect(caughtError.message).toBe('child sad'); }); + + it('propagates uncaught error inside unbatched initial mount', () => { + function Foo() { + throw new Error('foo error'); + } + const container = document.createElement('div'); + expect(() => { + ReactDOM.unstable_batchedUpdates(() => { + ReactDOM.render(, container); + }); + }).toThrow('foo error'); + }); }); diff --git a/packages/react-reconciler/src/ReactFiberScheduler.js b/packages/react-reconciler/src/ReactFiberScheduler.js index 66c05df6cc..3ec8cdde42 100644 --- a/packages/react-reconciler/src/ReactFiberScheduler.js +++ b/packages/react-reconciler/src/ReactFiberScheduler.js @@ -1330,7 +1330,9 @@ export default function( if (isUnbatchingUpdates) { // ...unless we're inside unbatchedUpdates, in which case we should // flush it now. - performWorkOnRoot(root, Sync); + nextFlushedRoot = root; + nextFlushedExpirationTime = Sync; + performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime); } return; }