Skip to content

Commit 256d78d

Browse files
authored
Add feature flag for removing children Map support (#17990)
1 parent df134d3 commit 256d78d

10 files changed

+30
-9
lines changed

packages/react/src/ReactChildren.js

+15-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
REACT_ELEMENT_TYPE,
1212
REACT_PORTAL_TYPE,
1313
} from 'shared/ReactSymbols';
14+
import {disableMapsAsChildren} from 'shared/ReactFeatureFlags';
1415

1516
import {isValidElement, cloneAndReplaceKey} from './ReactElement';
1617
import ReactDebugCurrentFrame from './ReactDebugCurrentFrame';
@@ -158,14 +159,22 @@ function traverseAllChildrenImpl(
158159
} else {
159160
const iteratorFn = getIteratorFn(children);
160161
if (typeof iteratorFn === 'function') {
161-
if (__DEV__) {
162+
if (iteratorFn === children.entries) {
163+
if (disableMapsAsChildren) {
164+
invariant(
165+
false,
166+
'Maps are not valid as a React child (found: %s). Consider converting ' +
167+
'children to an array of keyed ReactElements instead.',
168+
children,
169+
);
170+
}
162171
// Warn about using Maps as children
163-
if (iteratorFn === children.entries) {
172+
if (__DEV__) {
164173
if (!didWarnAboutMaps) {
165-
console.error(
166-
'Using Maps as children is unsupported and will likely yield ' +
167-
'unexpected results. Convert it to a sequence/iterable of keyed ' +
168-
'ReactElements instead.',
174+
console.warn(
175+
'Using Maps as children is deprecated and will be removed in ' +
176+
'a future major release. Consider converting children to ' +
177+
'an array of keyed ReactElements instead.',
169178
);
170179
}
171180
didWarnAboutMaps = true;

packages/shared/ReactFeatureFlags.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ export const enableNativeTargetAsInstance = false;
9797
// This flag provides a killswitch if that proves to break existing code somehow.
9898
export const deferPassiveEffectCleanupDuringUnmount = false;
9999

100+
export const isTestEnvironment = false;
101+
100102
// --------------------------
101103
// Future APIs to be deprecated
102104
// --------------------------
@@ -115,12 +117,13 @@ export const disableCreateFactory = false;
115117
// Disables children for <textarea> elements
116118
export const disableTextareaChildren = false;
117119

120+
// Disables Maps as ReactElement children
121+
export const disableMapsAsChildren = false;
122+
118123
// Disables ReactDOM.unstable_renderSubtreeIntoContainer
119124
export const disableUnstableRenderSubtreeIntoContainer = false;
120125
// We should remove this flag once the above flag becomes enabled
121126
export const warnUnstableRenderSubtreeIntoContainer = false;
122127

123128
// Disables ReactDOM.unstable_createPortal
124129
export const disableUnstableCreatePortal = false;
125-
126-
export const isTestEnvironment = false;

packages/shared/forks/ReactFeatureFlags.native-fb.js

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export const enableTrainModelFix = true;
4747
export const enableTrustedTypesIntegration = false;
4848
export const disableCreateFactory = false;
4949
export const disableTextareaChildren = false;
50+
export const disableMapsAsChildren = false;
5051
export const disableUnstableRenderSubtreeIntoContainer = false;
5152
export const warnUnstableRenderSubtreeIntoContainer = false;
5253
export const disableUnstableCreatePortal = false;

packages/shared/forks/ReactFeatureFlags.native-oss.js

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export const enableTrustedTypesIntegration = false;
4242
export const enableNativeTargetAsInstance = false;
4343
export const disableCreateFactory = false;
4444
export const disableTextareaChildren = false;
45+
export const disableMapsAsChildren = false;
4546
export const disableUnstableRenderSubtreeIntoContainer = false;
4647
export const warnUnstableRenderSubtreeIntoContainer = false;
4748
export const disableUnstableCreatePortal = false;

packages/shared/forks/ReactFeatureFlags.persistent.js

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export const enableTrustedTypesIntegration = false;
4242
export const enableNativeTargetAsInstance = false;
4343
export const disableCreateFactory = false;
4444
export const disableTextareaChildren = false;
45+
export const disableMapsAsChildren = false;
4546
export const disableUnstableRenderSubtreeIntoContainer = false;
4647
export const warnUnstableRenderSubtreeIntoContainer = false;
4748
export const disableUnstableCreatePortal = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.js

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export const enableTrustedTypesIntegration = false;
4242
export const enableNativeTargetAsInstance = false;
4343
export const disableCreateFactory = false;
4444
export const disableTextareaChildren = false;
45+
export const disableMapsAsChildren = false;
4546
export const disableUnstableRenderSubtreeIntoContainer = false;
4647
export const warnUnstableRenderSubtreeIntoContainer = false;
4748
export const disableUnstableCreatePortal = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.www.js

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const enableTrustedTypesIntegration = false;
4040
export const enableNativeTargetAsInstance = false;
4141
export const disableCreateFactory = false;
4242
export const disableTextareaChildren = false;
43+
export const disableMapsAsChildren = false;
4344
export const disableUnstableRenderSubtreeIntoContainer = false;
4445
export const warnUnstableRenderSubtreeIntoContainer = false;
4546
export const disableUnstableCreatePortal = false;

packages/shared/forks/ReactFeatureFlags.testing.js

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export const enableTrustedTypesIntegration = false;
4242
export const enableNativeTargetAsInstance = false;
4343
export const disableCreateFactory = false;
4444
export const disableTextareaChildren = false;
45+
export const disableMapsAsChildren = false;
4546
export const disableUnstableRenderSubtreeIntoContainer = false;
4647
export const warnUnstableRenderSubtreeIntoContainer = false;
4748
export const disableUnstableCreatePortal = false;

packages/shared/forks/ReactFeatureFlags.www.js

+2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ export const disableCreateFactory = false;
9696

9797
export const disableTextareaChildren = false;
9898

99+
export const disableMapsAsChildren = false;
100+
99101
export const disableUnstableRenderSubtreeIntoContainer = false;
100102

101103
export const warnUnstableRenderSubtreeIntoContainer = false;

scripts/error-codes/codes.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -344,5 +344,6 @@
344344
"343": "ReactDOMServer does not yet support scope components.",
345345
"344": "Expected prepareToHydrateHostSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.",
346346
"345": "Root did not complete. This is a bug in React.",
347-
"346": "An event responder context was used outside of an event cycle."
347+
"346": "An event responder context was used outside of an event cycle.",
348+
"347": "Maps are not valid as a React child (found: %s). Consider converting children to an array of keyed ReactElements instead."
348349
}

0 commit comments

Comments
 (0)