From 609e97ebe7fb9abfe6d4fedf36ad132ede2ac80d Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Mon, 17 Apr 2017 14:56:10 -0700 Subject: [PATCH] instance.unstable_asyncUpdates = true creates an async subtree Same behavior as unstable_asyncRender. Can be used to wrap a specific subtree, rather than an entire root. --- .../__tests__/ReactDOMFiberAsync-test.js | 46 +++++++++++++++++++ .../shared/fiber/ReactFiberClassComponent.js | 4 ++ 2 files changed, 50 insertions(+) diff --git a/src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js b/src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js index 2d9f6d9d60..3879d59dae 100644 --- a/src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js +++ b/src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js @@ -70,6 +70,52 @@ describe('ReactDOMFiberAsync', () => { jest.runAllTimers(); expect(container.textContent).toEqual('1'); }); + + it('unstable_asyncUpdates creates an async subtree', () => { + let instance; + class Component extends React.Component { + state = {step: 0}; + unstable_asyncUpdates = true; + render() { + instance = this; + return
{this.state.step}
; + } + } + + ReactDOM.render(, container); + jest.runAllTimers(); + + instance.setState({step: 1}); + expect(container.textContent).toEqual('0'); + jest.runAllTimers(); + expect(container.textContent).toEqual('1'); + }); + + it('updates inside an async subtree are async by default', () => { + class Component extends React.Component { + unstable_asyncUpdates = true; + render() { + return ; + } + } + + let instance; + class Child extends React.Component { + state = {step: 0}; + render() { + instance = this; + return
{this.state.step}
; + } + } + + ReactDOM.render(, container); + jest.runAllTimers(); + + instance.setState({step: 1}); + expect(container.textContent).toEqual('0'); + jest.runAllTimers(); + expect(container.textContent).toEqual('1'); + }) }); } }); diff --git a/src/renderers/shared/fiber/ReactFiberClassComponent.js b/src/renderers/shared/fiber/ReactFiberClassComponent.js index d899fcc6a9..8fcef7075f 100644 --- a/src/renderers/shared/fiber/ReactFiberClassComponent.js +++ b/src/renderers/shared/fiber/ReactFiberClassComponent.js @@ -305,6 +305,10 @@ module.exports = function( instance.refs = emptyObject; instance.context = getMaskedContext(workInProgress, unmaskedContext); + if (instance.unstable_asyncUpdates === true) { + workInProgress.contextTag |= AsyncUpdates; + } + if (typeof instance.componentWillMount === 'function') { if (__DEV__) { startPhaseTimer(workInProgress, 'componentWillMount');