From 723851bc64bc70e045439f2f1f8cefaef277dcc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Sat, 18 May 2024 01:15:45 +0800 Subject: [PATCH] fix: nativeElement has high priority --- src/Dom/findDOMNode.ts | 8 ++++---- tests/findDOMNode.test.tsx | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/Dom/findDOMNode.ts b/src/Dom/findDOMNode.ts index 900f15b4..fc81f37d 100644 --- a/src/Dom/findDOMNode.ts +++ b/src/Dom/findDOMNode.ts @@ -13,14 +13,14 @@ export function isDOM(node: any): node is HTMLElement | SVGElement { export default function findDOMNode( node: React.ReactInstance | HTMLElement | SVGElement | { nativeElement: T }, ): T { - if (isDOM(node)) { - return (node as unknown) as T; - } - if (node && typeof node === 'object' && isDOM((node as any).nativeElement)) { return ((node as any).nativeElement as unknown) as T; } + if (isDOM(node)) { + return (node as unknown) as T; + } + if (node instanceof React.Component) { return (ReactDOM.findDOMNode(node) as unknown) as T; } diff --git a/tests/findDOMNode.test.tsx b/tests/findDOMNode.test.tsx index bbc672db..1e783252 100644 --- a/tests/findDOMNode.test.tsx +++ b/tests/findDOMNode.test.tsx @@ -1,6 +1,7 @@ import { render } from '@testing-library/react'; import * as React from 'react'; import findDOMNode, { isDOM } from '../src/Dom/findDOMNode'; +import proxyObject from '../src/proxyObject'; describe('findDOMNode', () => { it('base work', () => { @@ -97,4 +98,35 @@ describe('findDOMNode', () => { expect(findDOMNode(elementRef.current)).toBe(container.querySelector('p')); }); + + it('with proxyObject', () => { + const Demo = React.forwardRef((_, ref) => { + const rootRef = React.useRef(null); + const spanRef = React.useRef(null); + + React.useImperativeHandle(ref, () => + proxyObject(rootRef.current, { + nativeElement: spanRef.current, + }), + ); + + return ( +

+ +

+ ); + }); + + const holderRef = React.createRef(); + const { container } = render( + + + , + ); + + expect(holderRef.current.id).toBe('root'); + expect(findDOMNode(holderRef.current)).toBe( + container.querySelector('span'), + ); + }); });