From cff2bf07b9afcf1ede25e880bb90634099af05fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=91=BE=F0=9D=92=96=F0=9D=92=99=F0=9D=92=89?= Date: Sat, 18 Jan 2025 17:24:18 +0800 Subject: [PATCH 1/3] feat: enhance DOM judgment fix: #2702 --- packages/hooks/src/utils/dom.ts | 25 +++++++++++++++++++++++++ packages/hooks/src/utils/domTarget.ts | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 packages/hooks/src/utils/dom.ts diff --git a/packages/hooks/src/utils/dom.ts b/packages/hooks/src/utils/dom.ts new file mode 100644 index 0000000000..4cee0493e1 --- /dev/null +++ b/packages/hooks/src/utils/dom.ts @@ -0,0 +1,25 @@ +/** + * Thx rc-util + * copied from https://github.com/react-component/util/blob/v5.44.3/src/Dom/findDOMNode.ts#L4-L23 + */ + +export function isDOM(node: any): node is HTMLElement | SVGElement { + // https://developer.mozilla.org/en-US/docs/Web/API/Element + // Since XULElement is also subclass of Element, we only need HTMLElement and SVGElement + return node instanceof HTMLElement || node instanceof SVGElement; +} + +/** + * Retrieves a DOM node via a ref, and does not invoke `findDOMNode`. + */ +export function getDOM(node: any): HTMLElement | SVGElement | null { + if (node && typeof node === 'object' && isDOM(node.nativeElement)) { + return node.nativeElement; + } + + if (isDOM(node)) { + return node as any; + } + + return null; +} diff --git a/packages/hooks/src/utils/domTarget.ts b/packages/hooks/src/utils/domTarget.ts index b7de1f628b..1762525c63 100644 --- a/packages/hooks/src/utils/domTarget.ts +++ b/packages/hooks/src/utils/domTarget.ts @@ -1,6 +1,7 @@ import type { MutableRefObject } from 'react'; import { isFunction } from './index'; import isBrowser from './isBrowser'; +import { getDOM } from './dom'; type TargetValue = T | undefined | null; @@ -30,5 +31,5 @@ export function getTargetElement(target: BasicTarget, d targetElement = target; } - return targetElement; + return getDOM(targetElement) ?? defaultElement; } From a232eb69f07ecce5d8c11fb91691c65f24392076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=91=BE=F0=9D=92=96=F0=9D=92=99=F0=9D=92=89?= Date: Sat, 18 Jan 2025 17:32:26 +0800 Subject: [PATCH 2/3] chore: update TS type --- packages/hooks/src/utils/domTarget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hooks/src/utils/domTarget.ts b/packages/hooks/src/utils/domTarget.ts index 1762525c63..7889fd5d99 100644 --- a/packages/hooks/src/utils/domTarget.ts +++ b/packages/hooks/src/utils/domTarget.ts @@ -31,5 +31,5 @@ export function getTargetElement(target: BasicTarget, d targetElement = target; } - return getDOM(targetElement) ?? defaultElement; + return (getDOM(targetElement) ?? defaultElement) as T; } From ee304b6b707736724d61b5aa78920aef2053a124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=91=BE=F0=9D=92=96=F0=9D=92=99=F0=9D=92=89?= Date: Sat, 18 Jan 2025 17:38:05 +0800 Subject: [PATCH 3/3] chore: update --- packages/hooks/src/utils/domTarget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hooks/src/utils/domTarget.ts b/packages/hooks/src/utils/domTarget.ts index 7889fd5d99..a63b0b677d 100644 --- a/packages/hooks/src/utils/domTarget.ts +++ b/packages/hooks/src/utils/domTarget.ts @@ -31,5 +31,5 @@ export function getTargetElement(target: BasicTarget, d targetElement = target; } - return (getDOM(targetElement) ?? defaultElement) as T; + return getDOM(targetElement) }