Skip to content

Commit 2504236

Browse files
committed
Remove defaultProps support (except for classes) (#28733)
This removes defaultProps support for all component types except for classes. We've chosen to continue supporting defaultProps for classes because lots of older code relies on it, and unlike function components, (which can use default params), there's no straightforward alternative. By implication, it also removes support for setting defaultProps on `React.lazy` wrapper. So this will not work: ```js const MyClassComponent = React.lazy(() => import('./MyClassComponent')); // MyClassComponent is not actually a class; it's a lazy wrapper. So // defaultProps does not work. MyClassComponent.defaultProps = { foo: 'bar' }; ``` However, if you set the default props on the class itself, then it's fine. For classes, this change also moves where defaultProps are resolved. Previously, defaultProps were resolved by the JSX runtime. This change is only observable if you introspect a JSX element, which is relatively rare but does happen. In other words, previously `<ClassWithDefaultProp />.props.aDefaultProp` would resolve to the default prop value, but now it does not. DiffTrain build for commit 48b4ecc.
1 parent c6a78b2 commit 2504236

17 files changed

+525
-274
lines changed

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react-test-renderer/cjs/ReactTestRenderer-dev.js

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<db6ccf0f194d95b91555bdb488cc0fab>>
10+
* @generated SignedSource<<3151ca79177b1e7b421f14db372bfd97>>
1111
*/
1212

1313
"use strict";
@@ -13206,7 +13206,11 @@ if (__DEV__) {
1320613206

1320713207
var defaultProps = Component.defaultProps;
1320813208

13209-
if (defaultProps && !alreadyResolvedDefaultProps) {
13209+
if (
13210+
defaultProps && // If disableDefaultPropsExceptForClasses is true, we always resolve
13211+
// default props here in the reconciler, rather than in the JSX runtime.
13212+
!alreadyResolvedDefaultProps
13213+
) {
1321013214
newProps = assign({}, newProps, baseProps);
1321113215

1321213216
for (var propName in defaultProps) {
@@ -13219,10 +13223,7 @@ if (__DEV__) {
1321913223
return newProps;
1322013224
}
1322113225

13222-
function resolveDefaultProps(Component, baseProps) {
13223-
// TODO: Remove support for default props for everything except class
13224-
// components, including setting default props on a lazy wrapper around a
13225-
// class type.
13226+
function resolveDefaultPropsOnNonClassComponent(Component, baseProps) {
1322613227
if (Component && Component.defaultProps) {
1322713228
// Resolve default props. Taken from ReactElement
1322813229
var props = assign({}, baseProps);
@@ -14073,17 +14074,20 @@ if (__DEV__) {
1407314074
}
1407414075

1407514076
{
14076-
if (Component.defaultProps !== undefined) {
14077-
var componentName = getComponentNameFromType(type) || "Unknown";
14077+
{
14078+
if (Component.defaultProps !== undefined) {
14079+
var componentName = getComponentNameFromType(type) || "Unknown";
1407814080

14079-
if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) {
14080-
error(
14081-
"%s: Support for defaultProps will be removed from memo components " +
14082-
"in a future major release. Use JavaScript default parameters instead.",
14083-
componentName
14084-
);
14081+
if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) {
14082+
error(
14083+
"%s: Support for defaultProps will be removed from memo components " +
14084+
"in a future major release. Use JavaScript default parameters instead.",
14085+
componentName
14086+
);
1408514087

14086-
didWarnAboutDefaultPropsOnFunctionComponent[componentName] = true;
14088+
didWarnAboutDefaultPropsOnFunctionComponent[componentName] =
14089+
true;
14090+
}
1408714091
}
1408814092
}
1408914093
}
@@ -15051,7 +15055,10 @@ if (__DEV__) {
1505115055
renderLanes
1505215056
);
1505315057
} else {
15054-
var _resolvedProps = resolveDefaultProps(Component, props);
15058+
var _resolvedProps = resolveDefaultPropsOnNonClassComponent(
15059+
Component,
15060+
props
15061+
);
1505515062

1505615063
workInProgress.tag = FunctionComponent;
1505715064

@@ -15073,7 +15080,10 @@ if (__DEV__) {
1507315080
var $$typeof = Component.$$typeof;
1507415081

1507515082
if ($$typeof === REACT_FORWARD_REF_TYPE) {
15076-
var _resolvedProps2 = resolveDefaultProps(Component, props);
15083+
var _resolvedProps2 = resolveDefaultPropsOnNonClassComponent(
15084+
Component,
15085+
props
15086+
);
1507715087

1507815088
workInProgress.tag = ForwardRef;
1507915089

@@ -15090,14 +15100,20 @@ if (__DEV__) {
1509015100
renderLanes
1509115101
);
1509215102
} else if ($$typeof === REACT_MEMO_TYPE) {
15093-
var _resolvedProps3 = resolveDefaultProps(Component, props);
15103+
var _resolvedProps3 = resolveDefaultPropsOnNonClassComponent(
15104+
Component,
15105+
props
15106+
);
1509415107

1509515108
workInProgress.tag = MemoComponent;
1509615109
return updateMemoComponent(
1509715110
null,
1509815111
workInProgress,
1509915112
Component,
15100-
resolveDefaultProps(Component.type, _resolvedProps3), // The inner type can have defaults too
15113+
resolveDefaultPropsOnNonClassComponent(
15114+
Component.type,
15115+
_resolvedProps3
15116+
), // The inner type can have defaults too
1510115117
renderLanes
1510215118
);
1510315119
}
@@ -16969,7 +16985,10 @@ if (__DEV__) {
1696916985
var resolvedProps =
1697016986
workInProgress.elementType === Component
1697116987
? unresolvedProps
16972-
: resolveDefaultProps(Component, unresolvedProps);
16988+
: resolveDefaultPropsOnNonClassComponent(
16989+
Component,
16990+
unresolvedProps
16991+
);
1697316992
return updateFunctionComponent(
1697416993
current,
1697516994
workInProgress,
@@ -17028,7 +17047,7 @@ if (__DEV__) {
1702817047
var _resolvedProps5 =
1702917048
workInProgress.elementType === type
1703017049
? _unresolvedProps2
17031-
: resolveDefaultProps(type, _unresolvedProps2);
17050+
: resolveDefaultPropsOnNonClassComponent(type, _unresolvedProps2);
1703217051

1703317052
return updateForwardRef(
1703417053
current,
@@ -17058,9 +17077,15 @@ if (__DEV__) {
1705817077
var _type = workInProgress.type;
1705917078
var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.
1706017079

17061-
var _resolvedProps6 = resolveDefaultProps(_type, _unresolvedProps3);
17080+
var _resolvedProps6 = resolveDefaultPropsOnNonClassComponent(
17081+
_type,
17082+
_unresolvedProps3
17083+
);
1706217084

17063-
_resolvedProps6 = resolveDefaultProps(_type.type, _resolvedProps6);
17085+
_resolvedProps6 = resolveDefaultPropsOnNonClassComponent(
17086+
_type.type,
17087+
_resolvedProps6
17088+
);
1706417089
return updateMemoComponent(
1706517090
current,
1706617091
workInProgress,
@@ -24265,7 +24290,10 @@ if (__DEV__) {
2426524290
var resolvedProps =
2426624291
unitOfWork.elementType === Component
2426724292
? unresolvedProps
24268-
: resolveDefaultProps(Component, unresolvedProps);
24293+
: resolveDefaultPropsOnNonClassComponent(
24294+
Component,
24295+
unresolvedProps
24296+
);
2426924297
var context;
2427024298

2427124299
{
@@ -24299,7 +24327,10 @@ if (__DEV__) {
2429924327
var _resolvedProps =
2430024328
unitOfWork.elementType === _Component
2430124329
? _unresolvedProps
24302-
: resolveDefaultProps(_Component, _unresolvedProps);
24330+
: resolveDefaultPropsOnNonClassComponent(
24331+
_Component,
24332+
_unresolvedProps
24333+
);
2430324334

2430424335
next = replayFunctionComponent(
2430524336
current,
@@ -26792,7 +26823,7 @@ if (__DEV__) {
2679226823
return root;
2679326824
}
2679426825

26795-
var ReactVersion = "19.0.0-canary-7222486b";
26826+
var ReactVersion = "19.0.0-canary-29bd6113";
2679626827

2679726828
// Might add PROFILE later.
2679826829

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react-test-renderer/cjs/ReactTestRenderer-prod.js

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<d22e4f68e4066f13b69d1eb196608c2c>>
10+
* @generated SignedSource<<432e9d2dc4a6b45da0162dd89f63ecfc>>
1111
*/
1212

1313
"use strict";
@@ -3541,7 +3541,7 @@ function resolveClassComponentProps(
35413541
}
35423542
return newProps;
35433543
}
3544-
function resolveDefaultProps(Component, baseProps) {
3544+
function resolveDefaultPropsOnNonClassComponent(Component, baseProps) {
35453545
if (Component && Component.defaultProps) {
35463546
baseProps = assign({}, baseProps);
35473547
Component = Component.defaultProps;
@@ -4957,7 +4957,7 @@ function beginWork(current, workInProgress, renderLanes) {
49574957
props,
49584958
renderLanes
49594959
)))
4960-
: ((props = resolveDefaultProps(current, props)),
4960+
: ((props = resolveDefaultPropsOnNonClassComponent(current, props)),
49614961
(workInProgress.tag = 0),
49624962
(workInProgress = updateFunctionComponent(
49634963
null,
@@ -4972,7 +4972,7 @@ function beginWork(current, workInProgress, renderLanes) {
49724972
((elementType = current.$$typeof),
49734973
elementType === REACT_FORWARD_REF_TYPE)
49744974
) {
4975-
props = resolveDefaultProps(current, props);
4975+
props = resolveDefaultPropsOnNonClassComponent(current, props);
49764976
workInProgress.tag = 11;
49774977
workInProgress = updateForwardRef(
49784978
null,
@@ -4983,13 +4983,13 @@ function beginWork(current, workInProgress, renderLanes) {
49834983
);
49844984
break a;
49854985
} else if (elementType === REACT_MEMO_TYPE) {
4986-
props = resolveDefaultProps(current, props);
4986+
props = resolveDefaultPropsOnNonClassComponent(current, props);
49874987
workInProgress.tag = 14;
49884988
workInProgress = updateMemoComponent(
49894989
null,
49904990
workInProgress,
49914991
current,
4992-
resolveDefaultProps(current.type, props),
4992+
resolveDefaultPropsOnNonClassComponent(current.type, props),
49934993
renderLanes
49944994
);
49954995
break a;
@@ -5009,7 +5009,7 @@ function beginWork(current, workInProgress, renderLanes) {
50095009
(elementType =
50105010
workInProgress.elementType === props
50115011
? elementType
5012-
: resolveDefaultProps(props, elementType)),
5012+
: resolveDefaultPropsOnNonClassComponent(props, elementType)),
50135013
updateFunctionComponent(
50145014
current,
50155015
workInProgress,
@@ -5115,7 +5115,7 @@ function beginWork(current, workInProgress, renderLanes) {
51155115
(elementType =
51165116
workInProgress.elementType === props
51175117
? elementType
5118-
: resolveDefaultProps(props, elementType)),
5118+
: resolveDefaultPropsOnNonClassComponent(props, elementType)),
51195119
updateForwardRef(
51205120
current,
51215121
workInProgress,
@@ -5198,8 +5198,14 @@ function beginWork(current, workInProgress, renderLanes) {
51985198
case 14:
51995199
return (
52005200
(props = workInProgress.type),
5201-
(elementType = resolveDefaultProps(props, workInProgress.pendingProps)),
5202-
(elementType = resolveDefaultProps(props.type, elementType)),
5201+
(elementType = resolveDefaultPropsOnNonClassComponent(
5202+
props,
5203+
workInProgress.pendingProps
5204+
)),
5205+
(elementType = resolveDefaultPropsOnNonClassComponent(
5206+
props.type,
5207+
elementType
5208+
)),
52035209
updateMemoComponent(
52045210
current,
52055211
workInProgress,
@@ -8106,7 +8112,7 @@ function replaySuspendedUnitOfWork(unitOfWork) {
81068112
unresolvedProps =
81078113
unitOfWork.elementType === Component
81088114
? unresolvedProps
8109-
: resolveDefaultProps(Component, unresolvedProps);
8115+
: resolveDefaultPropsOnNonClassComponent(Component, unresolvedProps);
81108116
var context = isContextProvider(Component)
81118117
? previousContext
81128118
: contextStackCursor$1.current;
@@ -8126,7 +8132,7 @@ function replaySuspendedUnitOfWork(unitOfWork) {
81268132
unresolvedProps =
81278133
unitOfWork.elementType === Component
81288134
? unresolvedProps
8129-
: resolveDefaultProps(Component, unresolvedProps);
8135+
: resolveDefaultPropsOnNonClassComponent(Component, unresolvedProps);
81308136
current = replayFunctionComponent(
81318137
current,
81328138
unitOfWork,
@@ -9210,7 +9216,7 @@ var devToolsConfig$jscomp$inline_995 = {
92109216
throw Error("TestRenderer does not support findFiberByHostInstance()");
92119217
},
92129218
bundleType: 0,
9213-
version: "19.0.0-canary-ffc2b014",
9219+
version: "19.0.0-canary-0689007c",
92149220
rendererPackageName: "react-test-renderer"
92159221
};
92169222
var internals$jscomp$inline_1185 = {
@@ -9241,7 +9247,7 @@ var internals$jscomp$inline_1185 = {
92419247
scheduleRoot: null,
92429248
setRefreshHandler: null,
92439249
getCurrentFiber: null,
9244-
reconcilerVersion: "19.0.0-canary-ffc2b014"
9250+
reconcilerVersion: "19.0.0-canary-0689007c"
92459251
};
92469252
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
92479253
var hook$jscomp$inline_1186 = __REACT_DEVTOOLS_GLOBAL_HOOK__;

0 commit comments

Comments
 (0)