Skip to content

Commit 83fc258

Browse files
authored
Remove <ConcurrentMode /> (#15532)
Use createSyncRoot instead.
1 parent 283ce53 commit 83fc258

File tree

15 files changed

+118
-686
lines changed

15 files changed

+118
-686
lines changed

fixtures/unstable-async/time-slicing/src/index.js

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, {PureComponent} from 'react';
2-
import {flushSync, render} from 'react-dom';
3-
import {unstable_scheduleCallback} from 'scheduler';
2+
import {flushSync, unstable_createRoot} from 'react-dom';
3+
import Scheduler from 'scheduler';
44
import _ from 'lodash';
55
import Charts from './Charts';
66
import Clock from './Clock';
@@ -67,7 +67,7 @@ class App extends PureComponent {
6767
}
6868
this._ignoreClick = true;
6969

70-
unstable_scheduleCallback(() => {
70+
Scheduler.unstable_next(() => {
7171
this.setState({showDemo: true}, () => {
7272
this._ignoreClick = false;
7373
});
@@ -146,9 +146,5 @@ class App extends PureComponent {
146146
}
147147

148148
const container = document.getElementById('root');
149-
render(
150-
<React.unstable_ConcurrentMode>
151-
<App />
152-
</React.unstable_ConcurrentMode>,
153-
container
154-
);
149+
const root = ReactDOM.unstable_createRoot(container);
150+
root.render(<App />, container);

packages/react-dom/src/__tests__/ReactDOMFiberAsync-test.internal.js

Lines changed: 11 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ let ReactFeatureFlags = require('shared/ReactFeatureFlags');
1616
let ReactDOM;
1717
let Scheduler;
1818

19-
const ConcurrentMode = React.unstable_ConcurrentMode;
20-
2119
const setUntrackedInputValue = Object.getOwnPropertyDescriptor(
2220
HTMLInputElement.prototype,
2321
'value',
@@ -86,12 +84,9 @@ describe('ReactDOMFiberAsync', () => {
8684
);
8785
}
8886
}
89-
ReactDOM.render(
90-
<ConcurrentMode>
91-
<Counter />
92-
</ConcurrentMode>,
93-
container,
94-
);
87+
const root = ReactDOM.unstable_createRoot(container);
88+
root.render(<Counter />);
89+
Scheduler.flushAll();
9590
expect(asyncValueRef.current.textContent).toBe('');
9691
expect(syncValueRef.current.textContent).toBe('');
9792

@@ -108,34 +103,7 @@ describe('ReactDOMFiberAsync', () => {
108103
expect(syncValueRef.current.textContent).toBe('hello');
109104
});
110105

111-
describe('with feature flag disabled', () => {
112-
beforeEach(() => {
113-
jest.resetModules();
114-
ReactFeatureFlags = require('shared/ReactFeatureFlags');
115-
ReactDOM = require('react-dom');
116-
Scheduler = require('scheduler');
117-
});
118-
119-
it('renders synchronously', () => {
120-
ReactDOM.render(
121-
<ConcurrentMode>
122-
<div>Hi</div>
123-
</ConcurrentMode>,
124-
container,
125-
);
126-
expect(container.textContent).toEqual('Hi');
127-
128-
ReactDOM.render(
129-
<ConcurrentMode>
130-
<div>Bye</div>
131-
</ConcurrentMode>,
132-
container,
133-
);
134-
expect(container.textContent).toEqual('Bye');
135-
});
136-
});
137-
138-
describe('with feature flag enabled', () => {
106+
describe('concurrent mode', () => {
139107
beforeEach(() => {
140108
jest.resetModules();
141109
ReactFeatureFlags = require('shared/ReactFeatureFlags');
@@ -144,7 +112,7 @@ describe('ReactDOMFiberAsync', () => {
144112
Scheduler = require('scheduler');
145113
});
146114

147-
it('createRoot makes the entire tree async', () => {
115+
it('top-level updates are concurrent', () => {
148116
const root = ReactDOM.unstable_createRoot(container);
149117
root.render(<div>Hi</div>);
150118
expect(container.textContent).toEqual('');
@@ -157,7 +125,7 @@ describe('ReactDOMFiberAsync', () => {
157125
expect(container.textContent).toEqual('Bye');
158126
});
159127

160-
it('updates inside an async tree are async by default', () => {
128+
it('deep updates (setState) are oncurrent', () => {
161129
let instance;
162130
class Component extends React.Component {
163131
state = {step: 0};
@@ -179,56 +147,6 @@ describe('ReactDOMFiberAsync', () => {
179147
expect(container.textContent).toEqual('1');
180148
});
181149

182-
it('ConcurrentMode creates an async subtree', () => {
183-
let instance;
184-
class Component extends React.Component {
185-
state = {step: 0};
186-
render() {
187-
instance = this;
188-
return <div>{this.state.step}</div>;
189-
}
190-
}
191-
192-
ReactDOM.render(
193-
<ConcurrentMode>
194-
<Component />
195-
</ConcurrentMode>,
196-
container,
197-
);
198-
Scheduler.flushAll();
199-
200-
instance.setState({step: 1});
201-
expect(container.textContent).toEqual('0');
202-
Scheduler.flushAll();
203-
expect(container.textContent).toEqual('1');
204-
});
205-
206-
it('updates inside an async subtree are async by default', () => {
207-
let instance;
208-
class Child extends React.Component {
209-
state = {step: 0};
210-
render() {
211-
instance = this;
212-
return <div>{this.state.step}</div>;
213-
}
214-
}
215-
216-
ReactDOM.render(
217-
<div>
218-
<ConcurrentMode>
219-
<Child />
220-
</ConcurrentMode>
221-
</div>,
222-
container,
223-
);
224-
Scheduler.flushAll();
225-
226-
instance.setState({step: 1});
227-
expect(container.textContent).toEqual('0');
228-
Scheduler.flushAll();
229-
expect(container.textContent).toEqual('1');
230-
});
231-
232150
it('flushSync batches sync updates and flushes them at the end of the batch', () => {
233151
let ops = [];
234152
let instance;
@@ -345,12 +263,8 @@ describe('ReactDOMFiberAsync', () => {
345263
}
346264
}
347265

348-
ReactDOM.render(
349-
<ConcurrentMode>
350-
<Component />
351-
</ConcurrentMode>,
352-
container,
353-
);
266+
const root = ReactDOM.unstable_createRoot(container);
267+
root.render(<Component />);
354268
Scheduler.flushAll();
355269

356270
// Updates are async by default
@@ -390,12 +304,9 @@ describe('ReactDOMFiberAsync', () => {
390304
return this.state.counter;
391305
}
392306
}
393-
ReactDOM.render(
394-
<ConcurrentMode>
395-
<Counter />
396-
</ConcurrentMode>,
397-
container,
398-
);
307+
const root = ReactDOM.unstable_createRoot(container);
308+
root.render(<Counter />);
309+
Scheduler.flushAll();
399310
expect(container.textContent).toEqual('0');
400311

401312
// Test that a normal update is async

packages/react-dom/src/__tests__/ReactDOMHooks-test.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ describe('ReactDOMHooks', () => {
141141
expect(labelRef.current.innerHTML).toBe('abc');
142142
});
143143

144-
it('should not bail out when an update is scheduled from within an event handler in ConcurrentMode', () => {
144+
it('should not bail out when an update is scheduled from within an event handler in Concurrent Mode', () => {
145145
const {createRef, useCallback, useState} = React;
146146

147147
const Example = ({inputRef, labelRef}) => {
@@ -162,11 +162,7 @@ describe('ReactDOMHooks', () => {
162162
const labelRef = createRef();
163163

164164
const root = ReactDOM.unstable_createRoot(container);
165-
root.render(
166-
<React.unstable_ConcurrentMode>
167-
<Example inputRef={inputRef} labelRef={labelRef} />
168-
</React.unstable_ConcurrentMode>,
169-
);
165+
root.render(<Example inputRef={inputRef} labelRef={labelRef} />);
170166

171167
Scheduler.flushAll();
172168

packages/react-dom/src/__tests__/ReactDOMRoot-test.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ let React = require('react');
1313
let ReactDOM = require('react-dom');
1414
let ReactDOMServer = require('react-dom/server');
1515
let Scheduler = require('scheduler');
16-
let ConcurrentMode = React.unstable_ConcurrentMode;
1716

1817
describe('ReactDOMRoot', () => {
1918
let container;
@@ -25,7 +24,6 @@ describe('ReactDOMRoot', () => {
2524
ReactDOM = require('react-dom');
2625
ReactDOMServer = require('react-dom/server');
2726
Scheduler = require('scheduler');
28-
ConcurrentMode = React.unstable_ConcurrentMode;
2927
});
3028

3129
it('renders children', () => {
@@ -47,7 +45,7 @@ describe('ReactDOMRoot', () => {
4745

4846
it('`root.render` returns a thenable work object', () => {
4947
const root = ReactDOM.unstable_createRoot(container);
50-
const work = root.render(<ConcurrentMode>Hi</ConcurrentMode>);
48+
const work = root.render('Hi');
5149
let ops = [];
5250
work.then(() => {
5351
ops.push('inside callback: ' + container.textContent);
@@ -65,7 +63,7 @@ describe('ReactDOMRoot', () => {
6563

6664
it('resolves `work.then` callback synchronously if the work already committed', () => {
6765
const root = ReactDOM.unstable_createRoot(container);
68-
const work = root.render(<ConcurrentMode>Hi</ConcurrentMode>);
66+
const work = root.render('Hi');
6967
Scheduler.flushAll();
7068
let ops = [];
7169
work.then(() => {
@@ -157,11 +155,7 @@ describe('ReactDOMRoot', () => {
157155

158156
const root = ReactDOM.unstable_createRoot(container);
159157
const batch = root.createBatch();
160-
batch.render(
161-
<ConcurrentMode>
162-
<App />
163-
</ConcurrentMode>,
164-
);
158+
batch.render(<App />);
165159

166160
Scheduler.flushAll();
167161

@@ -208,7 +202,7 @@ describe('ReactDOMRoot', () => {
208202
it('can wait for a batch to finish', () => {
209203
const root = ReactDOM.unstable_createRoot(container);
210204
const batch = root.createBatch();
211-
batch.render(<ConcurrentMode>Foo</ConcurrentMode>);
205+
batch.render('Foo');
212206

213207
Scheduler.flushAll();
214208

@@ -248,7 +242,7 @@ describe('ReactDOMRoot', () => {
248242

249243
it('can commit an empty batch', () => {
250244
const root = ReactDOM.unstable_createRoot(container);
251-
root.render(<ConcurrentMode>1</ConcurrentMode>);
245+
root.render(1);
252246

253247
Scheduler.advanceTime(2000);
254248
// This batch has a later expiration time than the earlier update.

packages/react-dom/src/__tests__/ReactDOMServerIntegrationModes-test.js

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -103,72 +103,4 @@ describe('ReactDOMServerIntegration', () => {
103103
expect(await render(<React.StrictMode />)).toBe(null);
104104
});
105105
});
106-
107-
describe('React.unstable_ConcurrentMode', () => {
108-
itRenders('an concurrent mode with one child', async render => {
109-
let e = await render(
110-
<React.unstable_ConcurrentMode>
111-
<div>text1</div>
112-
</React.unstable_ConcurrentMode>,
113-
);
114-
let parent = e.parentNode;
115-
expect(parent.childNodes[0].tagName).toBe('DIV');
116-
});
117-
118-
itRenders('an concurrent mode with several children', async render => {
119-
let Header = props => {
120-
return <p>header</p>;
121-
};
122-
let Footer = props => {
123-
return (
124-
<React.unstable_ConcurrentMode>
125-
<h2>footer</h2>
126-
<h3>about</h3>
127-
</React.unstable_ConcurrentMode>
128-
);
129-
};
130-
let e = await render(
131-
<React.unstable_ConcurrentMode>
132-
<div>text1</div>
133-
<span>text2</span>
134-
<Header />
135-
<Footer />
136-
</React.unstable_ConcurrentMode>,
137-
);
138-
let parent = e.parentNode;
139-
expect(parent.childNodes[0].tagName).toBe('DIV');
140-
expect(parent.childNodes[1].tagName).toBe('SPAN');
141-
expect(parent.childNodes[2].tagName).toBe('P');
142-
expect(parent.childNodes[3].tagName).toBe('H2');
143-
expect(parent.childNodes[4].tagName).toBe('H3');
144-
});
145-
146-
itRenders('a nested concurrent mode', async render => {
147-
let e = await render(
148-
<React.unstable_ConcurrentMode>
149-
<React.unstable_ConcurrentMode>
150-
<div>text1</div>
151-
</React.unstable_ConcurrentMode>
152-
<span>text2</span>
153-
<React.unstable_ConcurrentMode>
154-
<React.unstable_ConcurrentMode>
155-
<React.unstable_ConcurrentMode>
156-
{null}
157-
<p />
158-
</React.unstable_ConcurrentMode>
159-
{false}
160-
</React.unstable_ConcurrentMode>
161-
</React.unstable_ConcurrentMode>
162-
</React.unstable_ConcurrentMode>,
163-
);
164-
let parent = e.parentNode;
165-
expect(parent.childNodes[0].tagName).toBe('DIV');
166-
expect(parent.childNodes[1].tagName).toBe('SPAN');
167-
expect(parent.childNodes[2].tagName).toBe('P');
168-
});
169-
170-
itRenders('an empty concurrent mode', async render => {
171-
expect(await render(<React.unstable_ConcurrentMode />)).toBe(null);
172-
});
173-
});
174106
});

0 commit comments

Comments
 (0)