[react-dom] Remove `findDOMNode` from OSS builds (#28267)
In the next major `findDOMNode` is being removed. This PR removes the API from the react-dom entrypoints for OSS builds and re-exposes the implementation as part of internals. `findDOMNode` is being retained for Meta builds and so all tests that currently use it will continue to do so by accessing it from internals. Once the replacement API ships in an upcoming minor any tests that were using this API incidentally can be updated to use the new API and any tests asserting `findDOMNode`'s behavior directly can stick around until we remove it entirely (once Meta has moved away from it)
Josh Story committed
Mar 27, 2024 at 14:43 UTC
9ad40b1440a2c0b61530f3710e5dae3847611b9c
25 files changed
+114
-73
packages/react-dom/index.experimental.js
-1
@@ -12,7 +12,6 @@ export {
12
createPortal,
13
createRoot,
14
hydrateRoot,
15
- findDOMNode,
15
flushSync,
16
unstable_batchedUpdates,
17
unstable_runWithPriority, // DO NOT USE: Temporarily exposed to migrate off of Scheduler.runWithPriority.
packages/react-dom/index.js
-1
@@ -14,7 +14,6 @@ export {
14
createPortal,
15
createRoot,
16
hydrateRoot,
17
- findDOMNode,
17
flushSync,
18
render,
19
unmountComponentAtNode,
packages/react-dom/index.stable.js
-1
@@ -12,7 +12,6 @@ export {
12
createPortal,
13
createRoot,
14
hydrateRoot,
15
- findDOMNode,
15
flushSync,
16
render,
17
unmountComponentAtNode,
packages/react-dom/src/ReactDOMSharedInternals.js
+3
@@ -7,6 +7,7 @@
7
* @flow
8
*/
9
10
+import type {FindDOMNodeType} from './client/ReactDOMLegacy.js';
11
import type {HostDispatcher} from './shared/ReactDOMTypes';
12
13
type InternalsType = {
@@ -15,6 +16,7 @@ type InternalsType = {
16
ReactDOMCurrentDispatcher: {
17
current: HostDispatcher,
18
},
19
+ findDOMNode: null | FindDOMNodeType,
20
};
21
22
function noop() {}
@@ -35,6 +37,7 @@ const Internals: InternalsType = ({
37
ReactDOMCurrentDispatcher: {
38
current: DefaultDispatcher,
39
},
40
+ findDOMNode: null,
41
}: any);
42
43
export default Internals;
packages/react-dom/src/__tests__/ReactComponentLifeCycle-test.js
+4
-1
@@ -15,6 +15,7 @@ let React;
15
let ReactDOM;
16
let ReactDOMClient;
17
let PropTypes;
18
+let findDOMNode;
19
20
const clone = function (o) {
21
return JSON.parse(JSON.stringify(o));
@@ -95,6 +96,8 @@ describe('ReactComponentLifeCycle', () => {
96
97
React = require('react');
98
ReactDOM = require('react-dom');
99
+ findDOMNode =
100
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
101
ReactDOMClient = require('react-dom/client');
102
PropTypes = require('prop-types');
103
});
@@ -383,7 +386,7 @@ describe('ReactComponentLifeCycle', () => {
386
}
387
render() {
388
if (this.state.isMounted) {
386
- expect(ReactDOM.findDOMNode(this).tagName).toBe('DIV');
389
+ expect(findDOMNode(this).tagName).toBe('DIV');
390
}
391
return <div />;
392
}
packages/react-dom/src/__tests__/ReactDOM-test.js
+4
-1
@@ -11,6 +11,7 @@
11
12
let React;
13
let ReactDOM;
14
+let findDOMNode;
15
let ReactDOMClient;
16
let ReactDOMServer;
17
@@ -21,6 +22,8 @@ describe('ReactDOM', () => {
22
jest.resetModules();
23
React = require('react');
24
ReactDOM = require('react-dom');
25
+ findDOMNode =
26
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
27
ReactDOMClient = require('react-dom/client');
28
ReactDOMServer = require('react-dom/server');
29
@@ -494,7 +497,7 @@ describe('ReactDOM', () => {
497
});
498
499
const App = () => {
497
- ReactDOM.findDOMNode(instance);
500
+ findDOMNode(instance);
501
return <div />;
502
};
503
packages/react-dom/src/__tests__/ReactDOMComponent-test.js
+5
-1
@@ -2121,7 +2121,11 @@ describe('ReactDOMComponent', () => {
2121
2122
componentWillUnmount() {
2123
// Should not throw
2124
- expect(ReactDOM.findDOMNode(this).nodeName).toBe('SPAN');
2124
+ expect(
2125
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
2126
+ this,
2127
+ ).nodeName,
2128
+ ).toBe('SPAN');
2129
}
2130
}
2131
packages/react-dom/src/__tests__/ReactDOMEventListener-test.js
+10
-2
@@ -114,10 +114,18 @@ describe('ReactDOMEventListener', () => {
114
this.setState({clicked: true});
115
};
116
componentDidMount() {
117
- expect(ReactDOM.findDOMNode(this)).toBe(container.firstChild);
117
+ expect(
118
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
119
+ this,
120
+ ),
121
+ ).toBe(container.firstChild);
122
}
123
componentDidUpdate() {
120
- expect(ReactDOM.findDOMNode(this)).toBe(container.firstChild);
124
+ expect(
125
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
126
+ this,
127
+ ),
128
+ ).toBe(container.firstChild);
129
}
130
render() {
131
if (this.state.clicked) {
packages/react-dom/src/__tests__/ReactDOMLegacyFiber-test.js
+24
-6
@@ -111,7 +111,10 @@ describe('ReactDOMLegacyFiber', () => {
111
container,
112
);
113
114
- const textNode = ReactDOM.findDOMNode(instance);
114
+ const textNode =
115
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
116
+ instance,
117
+ );
118
expect(textNode).toBe(container.firstChild);
119
expect(textNode.nodeType).toBe(3);
120
expect(textNode.nodeValue).toBe('foo');
@@ -130,7 +133,10 @@ describe('ReactDOMLegacyFiber', () => {
133
134
expect(container.childNodes.length).toBe(2);
135
133
- const firstNode = ReactDOM.findDOMNode(instance);
136
+ const firstNode =
137
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
138
+ instance,
139
+ );
140
expect(firstNode).toBe(container.firstChild);
141
expect(firstNode.tagName).toBe('DIV');
142
});
@@ -159,7 +165,10 @@ describe('ReactDOMLegacyFiber', () => {
165
166
expect(container.childNodes.length).toBe(2);
167
162
- const firstNode = ReactDOM.findDOMNode(instance);
168
+ const firstNode =
169
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
170
+ instance,
171
+ );
172
expect(firstNode).toBe(container.firstChild);
173
expect(firstNode.tagName).toBe('DIV');
174
});
@@ -183,7 +192,10 @@ describe('ReactDOMLegacyFiber', () => {
192
193
expect(container.childNodes.length).toBe(2);
194
186
- const firstNode = ReactDOM.findDOMNode(instance);
195
+ const firstNode =
196
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
197
+ instance,
198
+ );
199
expect(firstNode).toBe(container.firstChild);
200
expect(firstNode.tagName).toBe('DIV');
201
});
@@ -878,13 +890,19 @@ describe('ReactDOMLegacyFiber', () => {
890
}
891
892
const myNodeA = ReactDOM.render(<MyNode />, container);
881
- const a = ReactDOM.findDOMNode(myNodeA);
893
+ const a =
894
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
895
+ myNodeA,
896
+ );
897
expect(a.tagName).toBe('DIV');
898
899
const myNodeB = ReactDOM.render(<MyNode flag={true} />, container);
900
expect(myNodeA === myNodeB).toBe(true);
901
887
- const b = ReactDOM.findDOMNode(myNodeB);
902
+ const b =
903
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
904
+ myNodeB,
905
+ );
906
expect(b.tagName).toBe('SPAN');
907
});
908
packages/react-dom/src/__tests__/ReactDOMSuspensePlaceholder-test.js
+7
-4
@@ -11,6 +11,7 @@
11
12
let React;
13
let ReactDOM;
14
+let findDOMNode;
15
let ReactDOMClient;
16
let Suspense;
17
let Scheduler;
@@ -24,6 +25,8 @@ describe('ReactDOMSuspensePlaceholder', () => {
25
jest.resetModules();
26
React = require('react');
27
ReactDOM = require('react-dom');
28
+ findDOMNode =
29
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
30
ReactDOMClient = require('react-dom/client');
31
Scheduler = require('scheduler');
32
act = require('internal-test-utils').act;
@@ -232,11 +235,11 @@ describe('ReactDOMSuspensePlaceholder', () => {
235
class Child extends React.Component {
236
componentDidMount() {
237
log.push('cDM ' + this.props.id);
235
- ReactDOM.findDOMNode(this);
238
+ findDOMNode(this);
239
}
240
componentDidUpdate() {
241
log.push('cDU ' + this.props.id);
239
- ReactDOM.findDOMNode(this);
242
+ findDOMNode(this);
243
}
244
render() {
245
return 'child';
@@ -291,12 +294,12 @@ describe('ReactDOMSuspensePlaceholder', () => {
294
class Child extends React.Component {
295
componentDidMount() {
296
log.push('cDM');
294
- ReactDOM.findDOMNode(this);
297
+ findDOMNode(this);
298
}
299
300
componentDidUpdate() {
301
log.push('cDU');
299
- ReactDOM.findDOMNode(this);
302
+ findDOMNode(this);
303
}
304
305
render() {
packages/react-dom/src/__tests__/ReactEmptyComponent-test.js
+7
-4
@@ -11,6 +11,7 @@
11
12
let React;
13
let ReactDOM;
14
+let findDOMNode;
15
let ReactDOMClient;
16
let TogglingComponent;
17
let act;
@@ -25,6 +26,8 @@ describe('ReactEmptyComponent', () => {
26
27
React = require('react');
28
ReactDOM = require('react-dom');
29
+ findDOMNode =
30
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
31
ReactDOMClient = require('react-dom/client');
32
Scheduler = require('scheduler');
33
const InternalTestUtils = require('internal-test-utils');
@@ -37,12 +40,12 @@ describe('ReactEmptyComponent', () => {
40
state = {component: this.props.firstComponent};
41
42
componentDidMount() {
40
- Scheduler.log('mount ' + ReactDOM.findDOMNode(this)?.nodeName);
43
+ Scheduler.log('mount ' + findDOMNode(this)?.nodeName);
44
this.setState({component: this.props.secondComponent});
45
}
46
47
componentDidUpdate() {
45
- Scheduler.log('update ' + ReactDOM.findDOMNode(this)?.nodeName);
48
+ Scheduler.log('update ' + findDOMNode(this)?.nodeName);
49
}
50
51
render() {
@@ -244,13 +247,13 @@ describe('ReactEmptyComponent', () => {
247
componentDidMount() {
248
// Make sure the DOM node resolves properly even if we're replacing a
249
// `null` component
247
- expect(ReactDOM.findDOMNode(this)).not.toBe(null);
250
+ expect(findDOMNode(this)).not.toBe(null);
251
}
252
253
componentWillUnmount() {
254
// Even though we're getting replaced by `null`, we haven't been
255
// replaced yet!
253
- expect(ReactDOM.findDOMNode(this)).not.toBe(null);
256
+ expect(findDOMNode(this)).not.toBe(null);
257
}
258
}
259
packages/react-dom/src/__tests__/ReactLegacyCompositeComponent-test.js
+10
-7
@@ -11,6 +11,7 @@
11
12
let React;
13
let ReactDOM;
14
+let findDOMNode;
15
let ReactDOMClient;
16
let PropTypes;
17
let act;
@@ -20,6 +21,8 @@ describe('ReactLegacyCompositeComponent', () => {
21
jest.resetModules();
22
React = require('react');
23
ReactDOM = require('react-dom');
24
+ findDOMNode =
25
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
26
ReactDOMClient = require('react-dom/client');
27
PropTypes = require('prop-types');
28
act = require('internal-test-utils').act;
@@ -115,7 +118,7 @@ describe('ReactLegacyCompositeComponent', () => {
118
await act(() => {
119
root.render(<Parent ref={current => (component = current)} />);
120
});
118
- expect(ReactDOM.findDOMNode(component).innerHTML).toBe('bar');
121
+ expect(findDOMNode(component).innerHTML).toBe('bar');
122
});
123
124
// @gate !disableLegacyContext
@@ -661,14 +664,14 @@ describe('ReactLegacyCompositeComponent', () => {
664
665
const container = document.createElement('div');
666
const comp = ReactDOM.render(<Component flipped={false} />, container);
664
- expect(ReactDOM.findDOMNode(comp.static0Ref.current).textContent).toBe('A');
665
- expect(ReactDOM.findDOMNode(comp.static1Ref.current).textContent).toBe('B');
667
+ expect(findDOMNode(comp.static0Ref.current).textContent).toBe('A');
668
+ expect(findDOMNode(comp.static1Ref.current).textContent).toBe('B');
669
670
// When flipping the order, the refs should update even though the actual
671
// contents do not
672
ReactDOM.render(<Component flipped={true} />, container);
670
- expect(ReactDOM.findDOMNode(comp.static0Ref.current).textContent).toBe('B');
671
- expect(ReactDOM.findDOMNode(comp.static1Ref.current).textContent).toBe('A');
673
+ expect(findDOMNode(comp.static0Ref.current).textContent).toBe('B');
674
+ expect(findDOMNode(comp.static1Ref.current).textContent).toBe('A');
675
});
676
677
// @gate !disableLegacyMode
@@ -678,12 +681,12 @@ describe('ReactLegacyCompositeComponent', () => {
681
682
class Component extends React.Component {
683
componentDidMount() {
681
- a = ReactDOM.findDOMNode(this);
684
+ a = findDOMNode(this);
685
expect(a).not.toBe(null);
686
}
687
688
componentWillUnmount() {
686
- b = ReactDOM.findDOMNode(this);
689
+ b = findDOMNode(this);
690
expect(b).not.toBe(null);
691
}
692
packages/react-dom/src/__tests__/ReactLegacyUpdates-test.js
+8
-5
@@ -11,6 +11,7 @@
11
12
let React;
13
let ReactDOM;
14
+let findDOMNode;
15
let act;
16
let Scheduler;
17
let assertLog;
@@ -22,6 +23,8 @@ describe('ReactLegacyUpdates', () => {
23
jest.resetModules();
24
React = require('react');
25
ReactDOM = require('react-dom');
26
+ findDOMNode =
27
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
28
act = require('internal-test-utils').act;
29
Scheduler = require('scheduler');
30
@@ -561,7 +564,7 @@ describe('ReactLegacyUpdates', () => {
564
state = {x: 0};
565
566
componentDidUpdate() {
564
- expect(ReactDOM.findDOMNode(b).textContent).toBe('B1');
567
+ expect(findDOMNode(b).textContent).toBe('B1');
568
aUpdated = true;
569
}
570
@@ -699,7 +702,7 @@ describe('ReactLegacyUpdates', () => {
702
depth={this.props.depth + 1}
703
count={this.props.count}
704
/>,
702
- ReactDOM.findDOMNode(this),
705
+ findDOMNode(this),
706
);
707
}
708
}
@@ -770,10 +773,10 @@ describe('ReactLegacyUpdates', () => {
773
const x = ReactDOM.render(<X />, container);
774
container = document.createElement('div');
775
const y = ReactDOM.render(<Y />, container);
773
- expect(ReactDOM.findDOMNode(x).textContent).toBe('0');
776
+ expect(findDOMNode(x).textContent).toBe('0');
777
778
y.forceUpdate();
776
- expect(ReactDOM.findDOMNode(x).textContent).toBe('1');
779
+ expect(findDOMNode(x).textContent).toBe('1');
780
});
781
782
// @gate !disableLegacyMode
@@ -816,7 +819,7 @@ describe('ReactLegacyUpdates', () => {
819
});
820
821
expect(a.state.x).toBe(1);
819
- expect(ReactDOM.findDOMNode(a).textContent).toBe('A1');
822
+ expect(findDOMNode(a).textContent).toBe('A1');
823
});
824
825
// @gate !disableLegacyMode
packages/react-dom/src/__tests__/ReactUpdates-test.js
+7
-4
@@ -11,6 +11,7 @@
11
12
let React;
13
let ReactDOM;
14
+let findDOMNode;
15
let ReactDOMClient;
16
let act;
17
let Scheduler;
@@ -23,6 +24,8 @@ describe('ReactUpdates', () => {
24
jest.resetModules();
25
React = require('react');
26
ReactDOM = require('react-dom');
27
+ findDOMNode =
28
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
29
ReactDOMClient = require('react-dom/client');
30
act = require('internal-test-utils').act;
31
Scheduler = require('scheduler');
@@ -659,7 +662,7 @@ describe('ReactUpdates', () => {
662
a = this;
663
}
664
componentDidUpdate() {
662
- expect(ReactDOM.findDOMNode(b).textContent).toBe('B1');
665
+ expect(findDOMNode(b).textContent).toBe('B1');
666
aUpdated = true;
667
}
668
@@ -801,7 +804,7 @@ describe('ReactUpdates', () => {
804
componentDidMount() {
805
instances.push(this);
806
if (this.props.depth < this.props.count) {
804
- const root = ReactDOMClient.createRoot(ReactDOM.findDOMNode(this));
807
+ const root = ReactDOMClient.createRoot(findDOMNode(this));
808
root.render(
809
<MockComponent
810
depth={this.props.depth + 1}
@@ -889,12 +892,12 @@ describe('ReactUpdates', () => {
892
root.render(<Y ref={current => (y = current)} />);
893
});
894
892
- expect(ReactDOM.findDOMNode(x).textContent).toBe('0');
895
+ expect(findDOMNode(x).textContent).toBe('0');
896
897
await act(() => {
898
y.forceUpdate();
899
});
897
- expect(ReactDOM.findDOMNode(x).textContent).toBe('1');
900
+ expect(findDOMNode(x).textContent).toBe('1');
901
});
902
903
it('should queue updates from during mount', async () => {
packages/react-dom/src/__tests__/findDOMNode-test.js
+12
-10
@@ -11,11 +11,13 @@
11
12
const React = require('react');
13
const ReactDOM = require('react-dom');
14
+const findDOMNode =
15
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
16
const StrictMode = React.StrictMode;
17
18
describe('findDOMNode', () => {
19
it('findDOMNode should return null if passed null', () => {
18
- expect(ReactDOM.findDOMNode(null)).toBe(null);
20
+ expect(findDOMNode(null)).toBe(null);
21
});
22
23
// @gate !disableLegacyMode
@@ -32,8 +34,8 @@ describe('findDOMNode', () => {
34
35
const container = document.createElement('div');
36
const myNode = ReactDOM.render(<MyNode />, container);
35
- const myDiv = ReactDOM.findDOMNode(myNode);
36
- const mySameDiv = ReactDOM.findDOMNode(myDiv);
37
+ const myDiv = findDOMNode(myNode);
38
+ const mySameDiv = findDOMNode(myDiv);
39
expect(myDiv.tagName).toBe('DIV');
40
expect(mySameDiv).toBe(myDiv);
41
});
@@ -55,19 +57,19 @@ describe('findDOMNode', () => {
57
const container = document.createElement('div');
58
59
const myNodeA = ReactDOM.render(<MyNode />, container);
58
- const a = ReactDOM.findDOMNode(myNodeA);
60
+ const a = findDOMNode(myNodeA);
61
expect(a).toBe(null);
62
63
const myNodeB = ReactDOM.render(<MyNode flag={true} />, container);
64
expect(myNodeA === myNodeB).toBe(true);
65
64
- const b = ReactDOM.findDOMNode(myNodeB);
66
+ const b = findDOMNode(myNodeB);
67
expect(b.tagName).toBe('SPAN');
68
});
69
70
it('findDOMNode should reject random objects', () => {
71
expect(function () {
70
- ReactDOM.findDOMNode({foo: 'bar'});
72
+ findDOMNode({foo: 'bar'});
73
}).toThrowError('Argument appears to not be a ReactComponent. Keys: foo');
74
});
75
@@ -83,7 +85,7 @@ describe('findDOMNode', () => {
85
const inst = ReactDOM.render(<Foo />, container);
86
ReactDOM.unmountComponentAtNode(container);
87
86
- expect(() => ReactDOM.findDOMNode(inst)).toThrowError(
88
+ expect(() => findDOMNode(inst)).toThrowError(
89
'Unable to find node on an unmounted component.',
90
);
91
});
@@ -92,7 +94,7 @@ describe('findDOMNode', () => {
94
it('findDOMNode should not throw an error when called within a component that is not mounted', () => {
95
class Bar extends React.Component {
96
UNSAFE_componentWillMount() {
95
- expect(ReactDOM.findDOMNode(this)).toBeNull();
97
+ expect(findDOMNode(this)).toBeNull();
98
}
99
100
render() {
@@ -127,7 +129,7 @@ describe('findDOMNode', () => {
129
);
130
131
let match;
130
- expect(() => (match = ReactDOM.findDOMNode(parent))).toErrorDev([
132
+ expect(() => (match = findDOMNode(parent))).toErrorDev([
133
'Warning: findDOMNode is deprecated in StrictMode. ' +
134
'findDOMNode was passed an instance of ContainsStrictModeChild which renders StrictMode children. ' +
135
'Instead, add a ref directly to the element you want to reference. ' +
@@ -160,7 +162,7 @@ describe('findDOMNode', () => {
162
);
163
164
let match;
163
- expect(() => (match = ReactDOM.findDOMNode(parent))).toErrorDev([
165
+ expect(() => (match = findDOMNode(parent))).toErrorDev([
166
'Warning: findDOMNode is deprecated in StrictMode. ' +
167
'findDOMNode was passed an instance of IsInStrictMode which is inside StrictMode. ' +
168
'Instead, add a ref directly to the element you want to reference. ' +
packages/react-dom/src/__tests__/react-dom-server-rendering-stub-test.js
+3
@@ -30,6 +30,9 @@ describe('react-dom-server-rendering-stub', () => {
30
expect(ReactDOM.createRoot).toBe(undefined);
31
expect(ReactDOM.hydrateRoot).toBe(undefined);
32
expect(ReactDOM.findDOMNode).toBe(undefined);
33
+ expect(
34
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode,
35
+ ).toBe(null);
36
expect(ReactDOM.hydrate).toBe(undefined);
37
expect(ReactDOM.render).toBe(undefined);
38
expect(ReactDOM.unmountComponentAtNode).toBe(undefined);
packages/react-dom/src/client/ReactDOM.js
+3
@@ -164,6 +164,9 @@ function flushSync<R>(fn: (() => R) | void): R | void {
164
return flushSyncWithoutWarningIfAlreadyRendering(fn);
165
}
166
167
+// Expose findDOMNode on internals
168
+Internals.findDOMNode = findDOMNode;
169
+
170
export {
171
createPortal,
172
batchedUpdates as unstable_batchedUpdates,
packages/react-dom/src/client/ReactDOMLegacy.js
+2
@@ -234,6 +234,8 @@ function legacyRenderSubtreeIntoContainer(
234
return getPublicRootInstance(root);
235
}
236
237
+export type FindDOMNodeType = typeof findDOMNode;
238
+
239
export function findDOMNode(
240
componentOrElement: Element | ?React$Component<any, any>,
241
): null | Element | Text {
packages/react-dom/unstable_testing.experimental.js
-1
@@ -9,7 +9,6 @@
9
10
export {
11
createPortal,
12
- findDOMNode,
12
flushSync,
13
unstable_batchedUpdates,
14
useFormStatus,
packages/react-dom/unstable_testing.js
-1
@@ -9,7 +9,6 @@
9
10
export {
11
createPortal,
12
- findDOMNode,
12
flushSync,
13
render,
14
unmountComponentAtNode,
packages/react-dom/unstable_testing.stable.js
-1
@@ -9,7 +9,6 @@
9
10
export {
11
createPortal,
12
- findDOMNode,
12
flushSync,
13
render,
14
unmountComponentAtNode,
packages/react/src/__tests__/ReactCoffeeScriptClass-test.coffee
-6
@@ -562,10 +562,4 @@ describe 'ReactCoffeeScriptClass', ->
562
]);
563
expect(ref.current.refs.inner.getName()).toBe 'foo'
564
565
- it 'supports drilling through to the DOM using findDOMNode', ->
566
- ref = React.createRef()
567
- test React.createElement(InnerComponent, name: 'foo', ref: ref), 'DIV', 'foo'
568
- node = ReactDOM.findDOMNode(ref.current)
569
- expect(node).toBe container.firstChild
570
-
565
undefined
packages/react/src/__tests__/ReactES6Class-test.js
-7
@@ -607,11 +607,4 @@ describe('ReactES6Class', () => {
607
expect(ref.current.refs.inner.getName()).toBe('foo');
608
});
609
}
610
-
611
- it('supports drilling through to the DOM using findDOMNode', () => {
612
- const ref = React.createRef();
613
- test(<Inner name="foo" ref={ref} />, 'DIV', 'foo');
614
- const node = ReactDOM.findDOMNode(ref.current);
615
- expect(node).toBe(container.firstChild);
616
- });
610
});
packages/react/src/__tests__/ReactJSXRuntime-test.js
+5
-2
@@ -15,6 +15,7 @@ let ReactDOMClient;
15
let JSXRuntime;
16
let JSXDEVRuntime;
17
let act;
18
+let findDOMNode;
19
20
// NOTE: Prefer to call the JSXRuntime directly in these tests so we can be
21
// certain that we are testing the runtime behavior, as opposed to the Babel
@@ -29,6 +30,8 @@ describe('ReactJSXRuntime', () => {
30
ReactDOM = require('react-dom');
31
ReactDOMClient = require('react-dom/client');
32
act = require('internal-test-utils').act;
33
+ findDOMNode =
34
+ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
35
});
36
37
it('allows static methods to be called using the type property', () => {
@@ -130,9 +133,9 @@ describe('ReactJSXRuntime', () => {
133
134
const outer = container.firstChild;
135
if (__DEV__) {
133
- expect(ReactDOM.findDOMNode(outer).className).toBe('moo');
136
+ expect(findDOMNode(outer).className).toBe('moo');
137
} else {
135
- expect(ReactDOM.findDOMNode(outer).className).toBe('quack');
138
+ expect(findDOMNode(outer).className).toBe('quack');
139
}
140
});
141
packages/react/src/__tests__/ReactTypeScriptClass-test.ts
-7
@@ -709,11 +709,4 @@ describe('ReactTypeScriptClass', function() {
709
expect(ref.current.refs.inner.getName()).toBe('foo');
710
});
711
}
712
-
713
- it('supports drilling through to the DOM using findDOMNode', function() {
714
- const ref = React.createRef();
715
- test(React.createElement(Inner, {name: 'foo', ref: ref}), 'DIV', 'foo');
716
- const node = ReactDOM.findDOMNode(ref.current);
717
- expect(node).toBe(container.firstChild);
718
- });
712
});