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};