diff --git a/fixtures/ssr/src/index.js b/fixtures/ssr/src/index.js
index 0af0c3127aa1d..8bef3639ae754 100644
--- a/fixtures/ssr/src/index.js
+++ b/fixtures/ssr/src/index.js
@@ -1,7 +1,6 @@
import React from 'react';
-import {createRoot} from 'react-dom';
+import {hydrateRoot} from 'react-dom';
import App from './components/App';
-let root = createRoot(document, {hydrate: true});
-root.render();
+let root = hydrateRoot(document, );
diff --git a/packages/react-dom/src/__tests__/ReactDOMFizzServer-test.js b/packages/react-dom/src/__tests__/ReactDOMFizzServer-test.js
index ca592002ad25e..d8db609f3f2cf 100644
--- a/packages/react-dom/src/__tests__/ReactDOMFizzServer-test.js
+++ b/packages/react-dom/src/__tests__/ReactDOMFizzServer-test.js
@@ -465,8 +465,7 @@ describe('ReactDOMFizzServer', () => {
expect(loggedErrors).toEqual([]);
// Attempt to hydrate the content.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
// We're still loading because we're waiting for the server to stream more content.
@@ -629,8 +628,7 @@ describe('ReactDOMFizzServer', () => {
expect(loggedErrors).toEqual([]);
// Attempt to hydrate the content.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
// We're still loading because we're waiting for the server to stream more content.
@@ -701,8 +699,7 @@ describe('ReactDOMFizzServer', () => {
pipe(writable);
});
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ const root = ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
// We're not hydrated yet.
@@ -769,8 +766,7 @@ describe('ReactDOMFizzServer', () => {
// We're still showing a fallback.
// Attempt to hydrate the content.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
// We're still loading because we're waiting for the server to stream more content.
@@ -1459,8 +1455,7 @@ describe('ReactDOMFizzServer', () => {
// We're still showing a fallback.
// Attempt to hydrate the content.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
// We're still loading because we're waiting for the server to stream more content.
diff --git a/packages/react-dom/src/__tests__/ReactDOMServerPartialHydration-test.internal.js b/packages/react-dom/src/__tests__/ReactDOMServerPartialHydration-test.internal.js
index 780228a4271cb..1c65501f7b382 100644
--- a/packages/react-dom/src/__tests__/ReactDOMServerPartialHydration-test.internal.js
+++ b/packages/react-dom/src/__tests__/ReactDOMServerPartialHydration-test.internal.js
@@ -155,8 +155,7 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -383,20 +382,15 @@ describe('ReactDOMServerPartialHydration', () => {
// hydrating anyway.
suspend = true;
suspend2 = true;
- const root = ReactDOM.createRoot(container, {
- hydrate: true,
- hydrationOptions: {
- onHydrated(node) {
- hydrated.push(node);
- },
- onDeleted(node) {
- deleted.push(node);
- },
+ const root = ReactDOM.hydrateRoot(container, , {
+ onHydrated(node) {
+ hydrated.push(node);
+ },
+ onDeleted(node) {
+ deleted.push(node);
},
});
- act(() => {
- root.render();
- });
+ Scheduler.unstable_flushAll();
expect(hydrated.length).toBe(0);
expect(deleted.length).toBe(0);
@@ -514,17 +508,12 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {
- hydrate: true,
- hydrationOptions: {
- onDeleted(node) {
- deleted.push(node);
- },
+ const root = ReactDOM.hydrateRoot(container, , {
+ onDeleted(node) {
+ deleted.push(node);
},
});
- act(() => {
- root.render();
- });
+ Scheduler.unstable_flushAll();
expect(deleted.length).toBe(0);
@@ -580,7 +569,7 @@ describe('ReactDOMServerPartialHydration', () => {
}).toErrorDev(
'Warning: Cannot hydrate Suspense in legacy mode. Switch from ' +
'ReactDOM.hydrate(element, container) to ' +
- 'ReactDOM.createRoot(container, { hydrate: true })' +
+ 'ReactDOM.hydrateRoot(container, )' +
'.render(element) or remove the Suspense components from the server ' +
'rendered components.' +
'\n in Suspense (at **)' +
@@ -660,8 +649,7 @@ describe('ReactDOMServerPartialHydration', () => {
suspend = true;
act(() => {
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
});
expect(container.firstChild.firstChild.tagName).not.toBe('DIV');
@@ -717,8 +705,7 @@ describe('ReactDOMServerPartialHydration', () => {
// hydrating anyway.
suspend = true;
act(() => {
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
});
expect(container.firstChild.children[1].textContent).toBe('Middle');
@@ -767,8 +754,10 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ const root = ReactDOM.hydrateRoot(
+ container,
+ ,
+ );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -839,8 +828,10 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ const root = ReactDOM.hydrateRoot(
+ container,
+ ,
+ );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -910,8 +901,10 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ const root = ReactDOM.hydrateRoot(
+ container,
+ ,
+ );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -983,8 +976,10 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ const root = ReactDOM.hydrateRoot(
+ container,
+ ,
+ );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -1055,8 +1050,10 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ const root = ReactDOM.hydrateRoot(
+ container,
+ ,
+ );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -1126,8 +1123,10 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ const root = ReactDOM.hydrateRoot(
+ container,
+ ,
+ );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -1206,11 +1205,10 @@ describe('ReactDOMServerPartialHydration', () => {
const container = document.createElement('div');
container.innerHTML = finalHTML;
- const root = ReactDOM.createRoot(container, {hydrate: true});
+ ReactDOM.hydrateRoot(container, );
await act(async () => {
suspend = true;
- root.render();
expect(Scheduler).toFlushAndYieldThrough(['Child']);
// While we're part way through the hydration, we update the state.
@@ -1277,8 +1275,8 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render(
+ const root = ReactDOM.hydrateRoot(
+ container,
,
@@ -1359,8 +1357,8 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render(
+ const root = ReactDOM.hydrateRoot(
+ container,
,
@@ -1437,8 +1435,7 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we have the data available quickly for some reason.
suspend = false;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -1493,8 +1490,7 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we have the data available quickly for some reason.
suspend = false;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
// This will have exceeded the suspended time so we should timeout.
jest.advanceTimersByTime(500);
@@ -1554,8 +1550,7 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we have the data available quickly for some reason.
suspend = false;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
// This will have exceeded the suspended time so we should timeout.
jest.advanceTimersByTime(500);
@@ -1621,12 +1616,9 @@ describe('ReactDOMServerPartialHydration', () => {
const spanB = container.getElementsByTagName('span')[1];
- const root = ReactDOM.createRoot(container, {hydrate: true});
-
+ const root = ReactDOM.hydrateRoot(container, );
suspend = true;
- act(() => {
- root.render();
- });
+ Scheduler.unstable_flushAll();
// We're not hydrated yet.
expect(ref.current).toBe(null);
@@ -1704,12 +1696,10 @@ describe('ReactDOMServerPartialHydration', () => {
const spanA = container.getElementsByTagName('span')[0];
- const root = ReactDOM.createRoot(container, {hydrate: true});
+ const root = ReactDOM.hydrateRoot(container, );
suspend = true;
- act(() => {
- root.render();
- });
+ Scheduler.unstable_flushAll();
// We're not hydrated yet.
expect(ref.current).toBe(null);
@@ -1868,13 +1858,10 @@ describe('ReactDOMServerPartialHydration', () => {
const container = document.createElement('div');
container.innerHTML = html;
- const root = ReactDOM.createRoot(container, {hydrate: true});
+ ReactDOM.hydrateRoot(container, );
suspend = true;
-
- await act(async () => {
- root.render();
- });
+ Scheduler.unstable_flushAll();
// We haven't hydrated the second child but the placeholder is still in the list.
expect(container.textContent).toBe('ALoading B');
@@ -1929,8 +1916,7 @@ describe('ReactDOMServerPartialHydration', () => {
const span = container.getElementsByTagName('span')[1];
suspend = false;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -1972,8 +1958,7 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -2025,8 +2010,8 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render(
+ const root = ReactDOM.hydrateRoot(
+ container,
,
@@ -2117,8 +2102,7 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -2205,8 +2189,7 @@ describe('ReactDOMServerPartialHydration', () => {
// hydrating anyway.
suspend = true;
isServerRendering = false;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// We'll do one click before hydrating.
a.click();
@@ -2296,8 +2279,7 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// We'll do one click before hydrating.
await act(async () => {
@@ -2392,8 +2374,7 @@ describe('ReactDOMServerPartialHydration', () => {
// hydrating anyway.
suspend = true;
isServerRendering = false;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// We'll do one click before hydrating.
a.click();
@@ -2480,8 +2461,7 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -2569,8 +2549,7 @@ describe('ReactDOMServerPartialHydration', () => {
suspend = true;
// Hydrate asynchronously.
- const root = ReactDOM.createRoot(childContainer, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(childContainer, );
jest.runAllTimers();
Scheduler.unstable_flushAll();
@@ -2668,8 +2647,7 @@ describe('ReactDOMServerPartialHydration', () => {
// hydrating anyway.
suspend1 = true;
suspend2 = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -2755,8 +2733,7 @@ describe('ReactDOMServerPartialHydration', () => {
container.innerHTML = finalHTML;
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ const root = ReactDOM.hydrateRoot(container, );
expect(Scheduler).toFlushAndYield([]);
expect(ref.current).toBe(null);
@@ -2842,8 +2819,7 @@ describe('ReactDOMServerPartialHydration', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
jest.runAllTimers();
@@ -2908,8 +2884,8 @@ describe('ReactDOMServerPartialHydration', () => {
const span = container.getElementsByTagName('span')[0];
expect(span.innerHTML).toBe('Hidden child');
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
+
Scheduler.unstable_flushAll();
expect(ref.current).toBe(span);
expect(span.innerHTML).toBe('Hidden child');
@@ -2937,8 +2913,7 @@ describe('ReactDOMServerPartialHydration', () => {
const span = container.getElementsByTagName('span')[0];
expect(span.innerHTML).toBe('Hidden child');
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
expect(ref.current).toBe(span);
expect(span.innerHTML).toBe('Hidden child');
@@ -2963,8 +2938,7 @@ describe('ReactDOMServerPartialHydration', () => {
const span = container.getElementsByTagName('span')[0];
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
expect(ref.current).toBe(span);
expect(ref.current.innerHTML).toBe('Hidden child');
diff --git a/packages/react-dom/src/__tests__/ReactDOMServerSelectiveHydration-test.internal.js b/packages/react-dom/src/__tests__/ReactDOMServerSelectiveHydration-test.internal.js
index 6c4dafbf5c300..435e90d9b1820 100644
--- a/packages/react-dom/src/__tests__/ReactDOMServerSelectiveHydration-test.internal.js
+++ b/packages/react-dom/src/__tests__/ReactDOMServerSelectiveHydration-test.internal.js
@@ -165,8 +165,7 @@ describe('ReactDOMServerSelectiveHydration', () => {
const span = container.getElementsByTagName('span')[1];
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// Nothing has been hydrated so far.
expect(Scheduler).toHaveYielded([]);
@@ -244,8 +243,7 @@ describe('ReactDOMServerSelectiveHydration', () => {
// A and D will be suspended. We'll click on D which should take
// priority, after we unsuspend.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// Nothing has been hydrated so far.
expect(Scheduler).toHaveYielded([]);
@@ -343,8 +341,7 @@ describe('ReactDOMServerSelectiveHydration', () => {
// A and D will be suspended. We'll click on D which should take
// priority, after we unsuspend.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// Nothing has been hydrated so far.
expect(Scheduler).toHaveYielded([]);
@@ -443,9 +440,7 @@ describe('ReactDOMServerSelectiveHydration', () => {
isServerRendering = false;
- const root = ReactDOM.createRoot(container, {hydrate: true});
-
- root.render();
+ ReactDOM.hydrateRoot(container, );
// Nothing has been hydrated so far.
expect(Scheduler).toHaveYielded([]);
@@ -530,8 +525,7 @@ describe('ReactDOMServerSelectiveHydration', () => {
// A and D will be suspended. We'll click on D which should take
// priority, after we unsuspend.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// Nothing has been hydrated so far.
expect(Scheduler).toHaveYielded([]);
@@ -629,8 +623,7 @@ describe('ReactDOMServerSelectiveHydration', () => {
// A and D will be suspended. We'll click on D which should take
// priority, after we unsuspend.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// Nothing has been hydrated so far.
expect(Scheduler).toHaveYielded([]);
@@ -739,8 +732,7 @@ describe('ReactDOMServerSelectiveHydration', () => {
// A and D will be suspended. We'll click on D which should take
// priority, after we unsuspend.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// Nothing has been hydrated so far.
expect(Scheduler).toHaveYielded([]);
@@ -1373,8 +1365,7 @@ describe('ReactDOMServerSelectiveHydration', () => {
// A and D will be suspended. We'll click on D which should take
// priority, after we unsuspend.
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container, );
// Nothing has been hydrated so far.
expect(Scheduler).toHaveYielded([]);
@@ -1489,10 +1480,8 @@ describe('ReactDOMServerSelectiveHydration', () => {
const spanB = container.getElementsByTagName('span')[2];
const spanC = container.getElementsByTagName('span')[4];
- const root = ReactDOM.createRoot(container, {hydrate: true});
act(() => {
- root.render();
-
+ const root = ReactDOM.hydrateRoot(container, );
// Hydrate the shell.
expect(Scheduler).toFlushAndYieldThrough(['App', 'Commit']);
diff --git a/packages/react-dom/src/__tests__/ReactDOMServerSuspense-test.internal.js b/packages/react-dom/src/__tests__/ReactDOMServerSuspense-test.internal.js
index c2eb630e52acd..327b83b940235 100644
--- a/packages/react-dom/src/__tests__/ReactDOMServerSuspense-test.internal.js
+++ b/packages/react-dom/src/__tests__/ReactDOMServerSuspense-test.internal.js
@@ -163,8 +163,7 @@ describe('ReactDOMServerSuspense', () => {
expect(divB.textContent).toBe('B');
act(() => {
- const root = ReactDOM.createRoot(parent, {hydrate: true});
- root.render(example);
+ ReactDOM.hydrateRoot(parent, example);
});
const parent2 = element.parentNode;
diff --git a/packages/react-dom/src/__tests__/ReactServerRenderingHydration-test.js b/packages/react-dom/src/__tests__/ReactServerRenderingHydration-test.js
index 6e2ec3150d7f7..0069946767252 100644
--- a/packages/react-dom/src/__tests__/ReactServerRenderingHydration-test.js
+++ b/packages/react-dom/src/__tests__/ReactServerRenderingHydration-test.js
@@ -403,8 +403,7 @@ describe('ReactDOMServerHydration', () => {
const finalHTML = ReactDOMServer.renderToString(
);
const container = document.createElement('div');
container.innerHTML = finalHTML;
- const root = ReactDOM.createRoot(container, {hydrate: true});
- root.render();
+ const root = ReactDOM.hydrateRoot(container, );
Scheduler.unstable_flushAll();
root.render(null);
Scheduler.unstable_flushAll();
diff --git a/packages/react-dom/src/client/ReactDOMRoot.js b/packages/react-dom/src/client/ReactDOMRoot.js
index 3c49a15fc14dc..800eeba0d018d 100644
--- a/packages/react-dom/src/client/ReactDOMRoot.js
+++ b/packages/react-dom/src/client/ReactDOMRoot.js
@@ -21,15 +21,6 @@ export type RootType = {
};
export type CreateRootOptions = {
- // TODO: Remove these options.
- hydrate?: boolean,
- hydrationOptions?: {
- onHydrated?: (suspenseNode: Comment) => void,
- onDeleted?: (suspenseNode: Comment) => void,
- mutableSources?: Array>,
- ...
- },
- // END OF TODO
unstable_strictMode?: boolean,
unstable_concurrentUpdatesByDefault?: boolean,
identifierPrefix?: string,
@@ -149,21 +140,17 @@ export function createRoot(
warnIfReactDOMContainerInDEV(container);
- // TODO: Delete these options
- const hydrate = options != null && options.hydrate === true;
- const hydrationCallbacks =
- (options != null && options.hydrationOptions) || null;
- const mutableSources =
- (options != null &&
- options.hydrationOptions != null &&
- options.hydrationOptions.mutableSources) ||
- null;
- // END TODO
-
let isStrictMode = false;
let concurrentUpdatesByDefaultOverride = false;
let identifierPrefix = '';
if (options !== null && options !== undefined) {
+ if (__DEV__) {
+ if ((options: any).hydrate) {
+ console.warn(
+ 'hydrate through createRoot is deprecated. Use ReactDOM.hydrateRoot(container, ) instead.',
+ );
+ }
+ }
if (options.unstable_strictMode === true) {
isStrictMode = true;
}
@@ -181,8 +168,8 @@ export function createRoot(
const root = createContainer(
container,
ConcurrentRoot,
- hydrate,
- hydrationCallbacks,
+ false,
+ null,
isStrictMode,
concurrentUpdatesByDefaultOverride,
identifierPrefix,
@@ -193,15 +180,6 @@ export function createRoot(
container.nodeType === COMMENT_NODE ? container.parentNode : container;
listenToAllSupportedEvents(rootContainerElement);
- // TODO: Delete this path
- if (mutableSources) {
- for (let i = 0; i < mutableSources.length; i++) {
- const mutableSource = mutableSources[i];
- registerMutableSourceForHydration(root, mutableSource);
- }
- }
- // END TODO
-
return new ReactDOMRoot(root);
}
diff --git a/packages/react-dom/src/events/__tests__/DOMPluginEventSystem-test.internal.js b/packages/react-dom/src/events/__tests__/DOMPluginEventSystem-test.internal.js
index 1b2bfbb0bef4d..248c07020e551 100644
--- a/packages/react-dom/src/events/__tests__/DOMPluginEventSystem-test.internal.js
+++ b/packages/react-dom/src/events/__tests__/DOMPluginEventSystem-test.internal.js
@@ -629,8 +629,7 @@ describe('DOMPluginEventSystem', () => {
suspend = true;
// Hydrate asynchronously.
- const root = ReactDOM.createRoot(childContainer, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(childContainer, );
jest.runAllTimers();
Scheduler.unstable_flushAll();
diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.new.js b/packages/react-reconciler/src/ReactFiberBeginWork.new.js
index d66bba0dc2ee3..02b2ec1a45f68 100644
--- a/packages/react-reconciler/src/ReactFiberBeginWork.new.js
+++ b/packages/react-reconciler/src/ReactFiberBeginWork.new.js
@@ -2586,7 +2586,7 @@ function mountDehydratedSuspenseComponent(
console.error(
'Cannot hydrate Suspense in legacy mode. Switch from ' +
'ReactDOM.hydrate(element, container) to ' +
- 'ReactDOM.createRoot(container, { hydrate: true })' +
+ 'ReactDOM.hydrateRoot(container, )' +
'.render(element) or remove the Suspense components from ' +
'the server rendered components.',
);
diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.old.js b/packages/react-reconciler/src/ReactFiberBeginWork.old.js
index 62d51046b3c46..8733ab0a4e51f 100644
--- a/packages/react-reconciler/src/ReactFiberBeginWork.old.js
+++ b/packages/react-reconciler/src/ReactFiberBeginWork.old.js
@@ -2586,7 +2586,7 @@ function mountDehydratedSuspenseComponent(
console.error(
'Cannot hydrate Suspense in legacy mode. Switch from ' +
'ReactDOM.hydrate(element, container) to ' +
- 'ReactDOM.createRoot(container, { hydrate: true })' +
+ 'ReactDOM.hydrateRoot(container, )' +
'.render(element) or remove the Suspense components from ' +
'the server rendered components.',
);
diff --git a/packages/react-reconciler/src/__tests__/ReactScope-test.internal.js b/packages/react-reconciler/src/__tests__/ReactScope-test.internal.js
index dedc8146d8082..9dd7d85b5b40d 100644
--- a/packages/react-reconciler/src/__tests__/ReactScope-test.internal.js
+++ b/packages/react-reconciler/src/__tests__/ReactScope-test.internal.js
@@ -312,8 +312,7 @@ describe('ReactScope', () => {
// On the client we don't have all data yet but we want to start
// hydrating anyway.
suspend = true;
- const root = ReactDOM.createRoot(container2, {hydrate: true});
- root.render();
+ ReactDOM.hydrateRoot(container2, );
Scheduler.unstable_flushAll();
jest.runAllTimers();
diff --git a/packages/react-reconciler/src/__tests__/useMutableSourceHydration-test.js b/packages/react-reconciler/src/__tests__/useMutableSourceHydration-test.js
index 61ebbe45e90c1..4c13ef7c35dfa 100644
--- a/packages/react-reconciler/src/__tests__/useMutableSourceHydration-test.js
+++ b/packages/react-reconciler/src/__tests__/useMutableSourceHydration-test.js
@@ -168,14 +168,10 @@ describe('useMutableSourceHydration', () => {
expect(Scheduler).toHaveYielded(['only:one']);
expect(source.listenerCount).toBe(0);
- const root = ReactDOM.createRoot(container, {
- hydrate: true,
- hydrationOptions: {
- mutableSources: [mutableSource],
- },
- });
act(() => {
- root.render();
+ ReactDOM.hydrateRoot(container, , {
+ mutableSources: [mutableSource],
+ });
});
expect(Scheduler).toHaveYielded(['only:one']);
expect(source.listenerCount).toBe(1);
@@ -205,22 +201,16 @@ describe('useMutableSourceHydration', () => {
expect(Scheduler).toHaveYielded(['only:one']);
expect(source.listenerCount).toBe(0);
- const root = ReactDOM.createRoot(container, {
- hydrate: true,
- hydrationOptions: {
- mutableSources: [mutableSource],
- },
- });
expect(() => {
act(() => {
- root.render();
+ ReactDOM.hydrateRoot(container, , {
+ mutableSources: [mutableSource],
+ });
source.value = 'two';
});
}).toErrorDev(
- 'Warning: An error occurred during hydration. ' +
- 'The server HTML was replaced with client content in .',
- {withoutStack: true},
+ 'Warning: Text content did not match. Server: "only:one" Client: "only:two"',
);
expect(Scheduler).toHaveYielded(['only:two']);
expect(source.listenerCount).toBe(1);
@@ -258,20 +248,18 @@ describe('useMutableSourceHydration', () => {
expect(Scheduler).toHaveYielded(['a:one', 'b:one']);
expect(source.listenerCount).toBe(0);
- const root = ReactDOM.createRoot(container, {
- hydrate: true,
- hydrationOptions: {
- mutableSources: [mutableSource],
- },
- });
expect(() => {
act(() => {
if (gate(flags => flags.enableSyncDefaultUpdates)) {
React.startTransition(() => {
- root.render(
);
+ ReactDOM.hydrateRoot(container,
, {
+ mutableSources: [mutableSource],
+ });
});
} else {
- root.render(
);
+ ReactDOM.hydrateRoot(container,
, {
+ mutableSources: [mutableSource],
+ });
}
expect(Scheduler).toFlushAndYieldThrough(['a:one']);
source.value = 'two';
@@ -318,50 +306,34 @@ describe('useMutableSourceHydration', () => {
container.innerHTML = htmlString;
expect(Scheduler).toHaveYielded(['0:a:one', '1:b:one']);
- const root = ReactDOM.createRoot(container, {
- hydrate: true,
- hydrationOptions: {
- mutableSources: [mutableSource],
- },
- });
expect(() => {
act(() => {
+ const fragment = (
+ <>
+
+
+ >
+ );
if (gate(flags => flags.enableSyncDefaultUpdates)) {
React.startTransition(() => {
- root.render(
- <>
-
-
- >,
- );
+ ReactDOM.hydrateRoot(container, fragment, {
+ mutableSources: [mutableSource],
+ });
});
} else {
- root.render(
- <>
-
-
- >,
- );
+ ReactDOM.hydrateRoot(container, fragment, {
+ mutableSources: [mutableSource],
+ });
}
expect(Scheduler).toFlushAndYieldThrough(['0:a:one']);
source.valueB = 'b:two';
@@ -409,21 +381,19 @@ describe('useMutableSourceHydration', () => {
expect(Scheduler).toHaveYielded([1, 'a:one']);
expect(source.listenerCount).toBe(0);
- const root = ReactDOM.createRoot(container, {
- hydrate: true,
- hydrationOptions: {
- mutableSources: [mutableSource],
- },
- });
-
expect(() => {
act(() => {
+ let root;
if (gate(flags => flags.enableSyncDefaultUpdates)) {
React.startTransition(() => {
- root.render(
);
+ root = ReactDOM.hydrateRoot(container,
, {
+ mutableSources: [mutableSource],
+ });
});
} else {
- root.render(
);
+ root = ReactDOM.hydrateRoot(container,
, {
+ mutableSources: [mutableSource],
+ });
}
expect(Scheduler).toFlushAndYieldThrough([1]);
@@ -438,19 +408,16 @@ describe('useMutableSourceHydration', () => {
dispatchAndSetCurrentEvent(arbitraryElement, mouseOverEvent);
expect(Scheduler).toFlushAndYieldThrough([2]);
-
source.value = 'two';
});
}).toErrorDev(
- [
- 'Warning: An error occurred during hydration. ' +
- 'The server HTML was replaced with client content in
.',
-
- 'Warning: Text content did not match. Server: "1" Client: "2"',
- ],
- {withoutStack: 1},
+ 'Warning: Text content did not match. Server: "1" Client: "2"',
);
- expect(Scheduler).toHaveYielded([2, 'a:two']);
expect(source.listenerCount).toBe(1);
+ if (gate(flags => flags.enableSyncDefaultUpdates)) {
+ expect(Scheduler).toHaveYielded([2, 'a:two']);
+ } else {
+ expect(Scheduler).toHaveYielded(['a:two']);
+ }
});
});