Move AsyncUpdates flag check to class-only path (#9570)
Andrew Clark committed
May 1, 2017 at 13:23 UTC
b1384062d2e7014a6c4a7d27c229846c07f9055c
3 files changed
+32
-23
src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js
+20
-12
@@ -25,10 +25,12 @@ describe('ReactDOMFiberAsync', () => {
25
26
if (ReactDOMFeatureFlags.useFiber) {
27
it('renders synchronously when feature flag is disabled', () => {
28
- function Async(props) {
29
- return props.children;
28
+ class Async extends React.Component {
29
+ static unstable_asyncUpdates = true;
30
+ render() {
31
+ return this.props.children;
32
+ }
33
}
31
- Async.unstable_asyncUpdates = true;
34
ReactDOM.render(<Async><div>Hi</div></Async>, container);
35
expect(container.textContent).toEqual('Hi');
36
@@ -46,10 +48,12 @@ describe('ReactDOMFiberAsync', () => {
48
});
49
50
it('unstable_asyncUpdates at the root makes the entire tree async', () => {
49
- function Async(props) {
50
- return props.children;
51
+ class Async extends React.Component {
52
+ static unstable_asyncUpdates = true;
53
+ render() {
54
+ return this.props.children;
55
+ }
56
}
52
- Async.unstable_asyncUpdates = true;
57
ReactDOM.render(<Async><div>Hi</div></Async>, container);
58
expect(container.textContent).toEqual('');
59
jest.runAllTimers();
@@ -62,10 +66,12 @@ describe('ReactDOMFiberAsync', () => {
66
});
67
68
it('updates inside an async tree are async by default', () => {
65
- function Async(props) {
66
- return props.children;
69
+ class Async extends React.Component {
70
+ static unstable_asyncUpdates = true;
71
+ render() {
72
+ return this.props.children;
73
+ }
74
}
68
- Async.unstable_asyncUpdates = true;
75
76
let instance;
77
class Component extends React.Component {
@@ -108,10 +114,12 @@ describe('ReactDOMFiberAsync', () => {
114
});
115
116
it('updates inside an async subtree are async by default', () => {
111
- function Component(props) {
112
- return <Child />;
117
+ class Component extends React.Component {
118
+ static unstable_asyncUpdates = true;
119
+ render() {
120
+ return <Child />;
121
+ }
122
}
114
- Component.unstable_asyncUpdates = true;
123
124
let instance;
125
class Child extends React.Component {
src/renderers/shared/fiber/ReactFiber.js
+1
-11
@@ -23,8 +23,6 @@ import type {TypeOfSideEffect} from 'ReactTypeOfSideEffect';
23
import type {PriorityLevel} from 'ReactPriorityLevel';
24
import type {UpdateQueue} from 'ReactFiberUpdateQueue';
25
26
-var ReactFeatureFlags = require('ReactFeatureFlags');
27
-
26
var {
27
IndeterminateComponent,
28
ClassComponent,
@@ -39,7 +37,7 @@ var {
37
38
var {NoWork} = require('ReactPriorityLevel');
39
42
-var {NoContext, AsyncUpdates} = require('ReactTypeOfInternalContext');
40
+var {NoContext} = require('ReactTypeOfInternalContext');
41
42
var {NoEffect} = require('ReactTypeOfSideEffect');
43
@@ -383,14 +381,6 @@ function createFiberFromElementType(
381
internalContextTag: TypeOfInternalContext,
382
debugOwner: null | Fiber | ReactInstance,
383
): Fiber {
386
- if (
387
- ReactFeatureFlags.enableAsyncSubtreeAPI &&
388
- type != null &&
389
- (type: any).unstable_asyncUpdates === true
390
- ) {
391
- internalContextTag |= AsyncUpdates;
392
- }
393
-
384
let fiber;
385
if (typeof type === 'function') {
386
fiber = shouldConstruct(type)
src/renderers/shared/fiber/ReactFiberClassComponent.js
+11
@@ -17,6 +17,9 @@ import type {PriorityLevel} from 'ReactPriorityLevel';
17
18
var {Update} = require('ReactTypeOfSideEffect');
19
20
+var ReactFeatureFlags = require('ReactFeatureFlags');
21
+var {AsyncUpdates} = require('ReactTypeOfInternalContext');
22
+
23
var {
24
cacheContext,
25
getMaskedContext,
@@ -325,6 +328,14 @@ module.exports = function(
328
instance.refs = emptyObject;
329
instance.context = getMaskedContext(workInProgress, unmaskedContext);
330
331
+ if (
332
+ ReactFeatureFlags.enableAsyncSubtreeAPI &&
333
+ workInProgress.type != null &&
334
+ workInProgress.type.unstable_asyncUpdates === true
335
+ ) {
336
+ workInProgress.internalContextTag |= AsyncUpdates;
337
+ }
338
+
339
if (typeof instance.componentWillMount === 'function') {
340
if (__DEV__) {
341
startPhaseTimer(workInProgress, 'componentWillMount');