Skip to content

Commit b3b65e6

Browse files
authored
remove React.findDOMNode (#611)
* remove React.findDOMNode * remove React.fondDOMNode * validate node.current is Dom node * add test case
1 parent e51807c commit b3b65e6

File tree

2 files changed

+35
-8
lines changed

2 files changed

+35
-8
lines changed

src/Dom/findDOMNode.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import React from 'react';
2-
import ReactDOM from 'react-dom';
32

43
export function isDOM(node: any): node is HTMLElement | SVGElement {
54
// https://developer.mozilla.org/en-US/docs/Web/API/Element
@@ -26,15 +25,23 @@ export function getDOM(node: any): HTMLElement | SVGElement | null {
2625
* Return if a node is a DOM node. Else will return by `findDOMNode`
2726
*/
2827
export default function findDOMNode<T = Element | Text>(
29-
node: React.ReactInstance | HTMLElement | SVGElement | { nativeElement: T },
30-
): T {
28+
node:
29+
| React.ReactInstance
30+
| HTMLElement
31+
| SVGElement
32+
| { nativeElement: T }
33+
| { current: T },
34+
): T | null {
3135
const domNode = getDOM(node);
3236
if (domNode) {
3337
return domNode as T;
3438
}
3539

36-
if (node instanceof React.Component) {
37-
return ReactDOM.findDOMNode?.(node) as unknown as T;
40+
if (node && typeof node === 'object' && 'current' in node) {
41+
const refDomNode = getDOM(node.current);
42+
if (refDomNode) {
43+
return refDomNode as T;
44+
}
3845
}
3946

4047
return null;

tests/findDOMNode.test.tsx

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,13 @@ describe('findDOMNode', () => {
3535
const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
3636

3737
class DOMWrapper extends React.Component {
38+
private elementRef = React.createRef<HTMLDivElement>();
3839
getDOM = () => {
39-
return findDOMNode(this);
40+
return findDOMNode(this.elementRef);
4041
};
4142

4243
render() {
43-
return <div />;
44+
return <div ref={this.elementRef} />;
4445
}
4546
}
4647

@@ -53,7 +54,7 @@ describe('findDOMNode', () => {
5354

5455
expect(wrapperRef.current!.getDOM()).toBe(container.firstChild);
5556

56-
expect(errSpy).toHaveBeenCalled();
57+
expect(errSpy).not.toHaveBeenCalled();
5758
errSpy.mockRestore();
5859
});
5960

@@ -75,7 +76,26 @@ describe('findDOMNode', () => {
7576
expect(true).toBeFalsy();
7677
}
7778
});
79+
it('should return DOM node from ref.current', () => {
80+
const TestComponent = React.forwardRef<HTMLDivElement>((_, ref) => {
81+
return <div ref={ref}>test</div>;
82+
});
7883

84+
const elementRef = React.createRef<HTMLDivElement>();
85+
const { container } = render(
86+
<React.StrictMode>
87+
<TestComponent ref={elementRef} />
88+
</React.StrictMode>,
89+
);
90+
91+
expect(findDOMNode(elementRef)).toBe(container.firstChild);
92+
});
93+
94+
it('should return null if ref is not mounted', () => {
95+
const elementRef = React.createRef<HTMLDivElement>();
96+
97+
expect(findDOMNode(elementRef)).toBeNull();
98+
});
7999
it('nativeElement', () => {
80100
const Element = React.forwardRef<{ nativeElement: HTMLDivElement }>(
81101
(_, ref) => {

0 commit comments

Comments
 (0)