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']); + } }); });