Skip to content

Commit 3bd634a

Browse files
committed
add warning when owner and self are different for string refs
1 parent 29b4d07 commit 3bd634a

File tree

2 files changed

+74
-10
lines changed

2 files changed

+74
-10
lines changed

packages/react-dom/src/__tests__/ReactDeprecationWarnings-test.internal.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,51 @@ describe('ReactDeprecationWarnings', () => {
6969
'\n in Component (at **)',
7070
);
7171
});
72+
73+
it('should not warn when owner and self are the same for string refs', () => {
74+
class RefComponent extends React.Component {
75+
render() {
76+
return null;
77+
}
78+
}
79+
class Component extends React.Component {
80+
render() {
81+
return <RefComponent ref="refComponent" __self={this} />;
82+
}
83+
}
84+
85+
ReactNoop.render(<Component />);
86+
expect(() => expect(Scheduler).toFlushWithoutYielding()).toErrorDev([
87+
'Warning: Component "Component" contains the string ref "refComponent". ' +
88+
'Support for string refs will be removed in a future major release. ' +
89+
'We recommend using useRef() or createRef() instead. ' +
90+
'Learn more about using refs safely here: ' +
91+
'https://fb.me/react-strict-mode-string-ref' +
92+
'\n in Component (at **)',
93+
]);
94+
});
95+
96+
it('should warn when owner and self are different for string refs', () => {
97+
class RefComponent extends React.Component {
98+
render() {
99+
return null;
100+
}
101+
}
102+
class Component extends React.Component {
103+
render() {
104+
return <RefComponent ref="refComponent" __self={{}} />;
105+
}
106+
}
107+
108+
ReactNoop.render(<Component />);
109+
expect(() => expect(Scheduler).toFlushWithoutYielding()).toErrorDev([
110+
'Warning: Owner and self do not match for the string ref "refComponent". Support for ' +
111+
'string refs will be removed in a future major release, and refs ' +
112+
'where owner and self are different cannot be safely codemoded. ' +
113+
'We recommend fixing these by hand by using useRef() or createRef() ' +
114+
'instead. Learn more about using refs safely here: ' +
115+
'https://fb.me/react-strict-mode-string-ref' +
116+
'\n in Component (at **)',
117+
]);
118+
});
72119
});

packages/react-reconciler/src/ReactChildFiber.js

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,16 +120,33 @@ function coerceRef(
120120
const componentName = getComponentName(returnFiber.type) || 'Component';
121121
if (!didWarnAboutStringRefs[componentName]) {
122122
if (warnAboutStringRefs) {
123-
console.error(
124-
'Component "%s" contains the string ref "%s". Support for string refs ' +
125-
'will be removed in a future major release. We recommend using ' +
126-
'useRef() or createRef() instead. ' +
127-
'Learn more about using refs safely here: ' +
128-
'https://fb.me/react-strict-mode-string-ref%s',
129-
componentName,
130-
mixedRef,
131-
getStackByFiberInDevAndProd(returnFiber),
132-
);
123+
if (
124+
element._owner &&
125+
element._self &&
126+
element._owner.stateNode !== element._self
127+
) {
128+
console.error(
129+
'Owner and self do not match for the string ref "%s". Support for ' +
130+
'string refs will be removed in a future major release, and refs ' +
131+
'where owner and self are different cannot be safely codemoded. ' +
132+
'We recommend fixing these by hand by using useRef() or createRef() ' +
133+
'instead. Learn more about using refs safely here: ' +
134+
'https://fb.me/react-strict-mode-string-ref%s',
135+
mixedRef,
136+
getStackByFiberInDevAndProd(returnFiber),
137+
);
138+
} else {
139+
console.error(
140+
'Component "%s" contains the string ref "%s". Support for string refs ' +
141+
'will be removed in a future major release. We recommend using ' +
142+
'useRef() or createRef() instead. ' +
143+
'Learn more about using refs safely here: ' +
144+
'https://fb.me/react-strict-mode-string-ref%s',
145+
componentName,
146+
mixedRef,
147+
getStackByFiberInDevAndProd(returnFiber),
148+
);
149+
}
133150
} else {
134151
console.error(
135152
'A string ref, "%s", has been found within a strict mode tree. ' +

0 commit comments

Comments
 (0)