diff --git a/packages/react-dom/index.classic.fb.js b/packages/react-dom/index.classic.fb.js index d8814243b690d..30e21f2d8f627 100644 --- a/packages/react-dom/index.classic.fb.js +++ b/packages/react-dom/index.classic.fb.js @@ -27,7 +27,6 @@ export { hydrate, render, unmountComponentAtNode, - unstable_batchedUpdates, unstable_createEventHandle, unstable_renderSubtreeIntoContainer, unstable_runWithPriority, // DO NOT USE: Temporarily exposed to migrate off of Scheduler.runWithPriority. @@ -42,4 +41,6 @@ export { version, } from './src/client/ReactDOM'; +export {unstable_batchedUpdates} from './src/client/ReactDOMLegacy'; + export {Internals as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED}; diff --git a/packages/react-dom/index.modern.fb.js b/packages/react-dom/index.modern.fb.js index 531f4d429b611..b967b549ef9c7 100644 --- a/packages/react-dom/index.modern.fb.js +++ b/packages/react-dom/index.modern.fb.js @@ -13,7 +13,6 @@ export { createRoot, hydrateRoot, flushSync, - unstable_batchedUpdates, unstable_createEventHandle, unstable_runWithPriority, // DO NOT USE: Temporarily exposed to migrate off of Scheduler.runWithPriority. useFormStatus, @@ -26,3 +25,5 @@ export { preinitModule, version, } from './src/client/ReactDOM'; + +export {unstable_batchedUpdates} from './src/client/ReactDOMLegacy'; diff --git a/packages/react-dom/src/ReactDOMSharedInternals.js b/packages/react-dom/src/ReactDOMSharedInternals.js index b082b4a19cc27..d675733a86958 100644 --- a/packages/react-dom/src/ReactDOMSharedInternals.js +++ b/packages/react-dom/src/ReactDOMSharedInternals.js @@ -11,7 +11,7 @@ import type {HostDispatcher} from './shared/ReactDOMTypes'; type InternalsType = { usingClientEntryPoint: boolean, - Events: [any, any, any, any, any, any], + Events: [any, any, any, any, any], Dispatcher: { current: null | HostDispatcher, }, diff --git a/packages/react-dom/src/__tests__/ReactLegacyMount-test.js b/packages/react-dom/src/__tests__/ReactLegacyMount-test.js index 78492811428c3..7e3df02956425 100644 --- a/packages/react-dom/src/__tests__/ReactLegacyMount-test.js +++ b/packages/react-dom/src/__tests__/ReactLegacyMount-test.js @@ -277,6 +277,8 @@ describe('ReactMount', () => { expect(calls).toBe(5); }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('initial mount of legacy root is sync inside batchedUpdates, as if it were wrapped in flushSync', () => { const container1 = document.createElement('div'); const container2 = document.createElement('div'); @@ -295,6 +297,7 @@ describe('ReactMount', () => { ReactDOM.render(
1
, container1); + console.log(ReactDOM.unstable_batchedUpdates.toString()); ReactDOM.unstable_batchedUpdates(() => { // Update. Does not flush yet. ReactDOM.render(
2
, container1); diff --git a/packages/react-dom/src/__tests__/ReactLegacyUpdates-test.js b/packages/react-dom/src/__tests__/ReactLegacyUpdates-test.js index d1e54dbb055ca..927c050a6d8ca 100644 --- a/packages/react-dom/src/__tests__/ReactLegacyUpdates-test.js +++ b/packages/react-dom/src/__tests__/ReactLegacyUpdates-test.js @@ -31,6 +31,8 @@ describe('ReactLegacyUpdates', () => { assertLog = InternalTestUtils.assertLog; }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('should batch state when updating state twice', () => { let updateCount = 0; @@ -60,6 +62,8 @@ describe('ReactLegacyUpdates', () => { expect(updateCount).toBe(1); }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('should batch state when updating two different state keys', () => { let updateCount = 0; @@ -92,6 +96,8 @@ describe('ReactLegacyUpdates', () => { expect(updateCount).toBe(1); }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('should batch state and props together', () => { let updateCount = 0; @@ -125,6 +131,8 @@ describe('ReactLegacyUpdates', () => { expect(updateCount).toBe(1); }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('should batch parent/child state updates together', () => { let parentUpdateCount = 0; @@ -179,6 +187,8 @@ describe('ReactLegacyUpdates', () => { expect(childUpdateCount).toBe(1); }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('should batch child/parent state updates together', () => { let parentUpdateCount = 0; @@ -235,6 +245,8 @@ describe('ReactLegacyUpdates', () => { expect(childUpdateCount).toBe(1); }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('should support chained state updates', () => { let updateCount = 0; @@ -274,6 +286,8 @@ describe('ReactLegacyUpdates', () => { expect(updateCount).toBe(2); }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('should batch forceUpdate together', () => { let shouldUpdateCount = 0; let updateCount = 0; @@ -530,6 +544,8 @@ describe('ReactLegacyUpdates', () => { ); }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('should queue mount-ready handlers across different roots', () => { // We'll define two components A and B, then update both of them. When A's // componentDidUpdate handlers is called, B's DOM should already have been @@ -817,6 +833,8 @@ describe('ReactLegacyUpdates', () => { expect(callbackCount).toBe(1); }); + // TODO: www-modern doesn't use the correct entry points in tests (#21505) + // @gate www && !experimental it('does not call render after a component as been deleted', () => { let renderCount = 0; let componentB = null; diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index f2e4c626070f4..c260b68926ee5 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -33,7 +33,6 @@ import { import {createEventHandle} from 'react-dom-bindings/src/client/ReactDOMEventHandle'; import { - batchedUpdates, flushSync as flushSyncWithoutWarningIfAlreadyRendering, isAlreadyRendering, injectIntoDevTools, @@ -165,9 +164,13 @@ function flushSync(fn: (() => R) | void): R | void { return flushSyncWithoutWarningIfAlreadyRendering(fn); } +function unstable_batchedUpdates(fn: (a: A) => R, a: A): R { + return fn(a); +} + export { createPortal, - batchedUpdates as unstable_batchedUpdates, + unstable_batchedUpdates, flushSync, ReactVersion as version, // Disabled behind disableLegacyReactDOMAPIs @@ -195,7 +198,6 @@ Internals.Events = [ getFiberCurrentPropsFromNode, enqueueStateRestore, restoreStateIfNeeded, - batchedUpdates, ]; const foundDevTools = injectIntoDevTools({ diff --git a/packages/react-dom/src/client/ReactDOMLegacy.js b/packages/react-dom/src/client/ReactDOMLegacy.js index 4937ce3f96c0a..0dafaec6e3bb5 100644 --- a/packages/react-dom/src/client/ReactDOMLegacy.js +++ b/packages/react-dom/src/client/ReactDOMLegacy.js @@ -30,6 +30,7 @@ import { } from 'react-dom-bindings/src/client/HTMLNodeType'; import { + batchedUpdates, createContainer, createHydrationContainer, findHostInstanceWithNoPortals, @@ -442,3 +443,5 @@ export function unmountComponentAtNode(container: Container): boolean { return false; } } + +export {batchedUpdates as unstable_batchedUpdates};