Skip to content

Commit 83a3ffd

Browse files
authored
chore: Fix warning of findDOMNode (#419)
* fix: findDOMNode should only work on validate element * fix: find logic
1 parent b02ee2f commit 83a3ffd

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

src/Dom/findDOMNode.ts

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

34
/**
@@ -7,7 +8,12 @@ export default function findDOMNode<T = Element | Text>(
78
node: React.ReactInstance | HTMLElement,
89
): T {
910
if (node instanceof HTMLElement) {
10-
return (node as unknown) as T;
11+
return node as unknown as T;
1112
}
12-
return (ReactDOM.findDOMNode(node) as unknown) as T;
13+
14+
if (node instanceof React.Component) {
15+
return ReactDOM.findDOMNode(node) as unknown as T;
16+
}
17+
18+
return null;
1319
}

tests/findDOMNode.test.tsx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import * as React from 'react';
2+
import { render } from '@testing-library/react';
3+
import findDOMNode from '../src/Dom/findDOMNode';
4+
5+
describe('findDOMNode', () => {
6+
it('base work', () => {
7+
const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
8+
9+
const divRef = React.createRef<HTMLDivElement>();
10+
const { container } = render(
11+
<React.StrictMode>
12+
<div ref={divRef} />
13+
</React.StrictMode>,
14+
);
15+
16+
const ele = findDOMNode(divRef.current);
17+
expect(container.firstChild).toBe(ele);
18+
19+
expect(errSpy).not.toHaveBeenCalled();
20+
errSpy.mockRestore();
21+
});
22+
23+
it('not throw if is not a React obj', () => {
24+
const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
25+
26+
const empty = findDOMNode({} as any);
27+
expect(empty).toBeNull();
28+
29+
expect(errSpy).not.toHaveBeenCalled();
30+
errSpy.mockRestore();
31+
});
32+
33+
it('class component', () => {
34+
const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
35+
36+
class DOMWrapper extends React.Component {
37+
getDOM = () => {
38+
return findDOMNode(this);
39+
};
40+
41+
render() {
42+
return <div />;
43+
}
44+
}
45+
46+
const wrapperRef = React.createRef<DOMWrapper>();
47+
const { container } = render(
48+
<React.StrictMode>
49+
<DOMWrapper ref={wrapperRef} />
50+
</React.StrictMode>,
51+
);
52+
53+
expect(wrapperRef.current!.getDOM()).toBe(container.firstChild);
54+
55+
expect(errSpy).toHaveBeenCalled();
56+
errSpy.mockRestore();
57+
});
58+
});

0 commit comments

Comments
 (0)