Skip to content

Commit 8fc31af

Browse files
committed
fix(useTrigger): use getNodeRef
1 parent 67c3267 commit 8fc31af

File tree

2 files changed

+12
-17
lines changed

2 files changed

+12
-17
lines changed

packages/components/_util/listener.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export const off = ((): any => {
2626
element: Node,
2727
event: string,
2828
handler: EventListenerOrEventListenerObject,
29-
options?: boolean | EventListenerOptions,
29+
options?: EventListenerOptions,
3030
): any => {
3131
if (element && event) {
3232
element.removeEventListener(event, handler, options ?? false);

packages/components/popup/hooks/useTrigger.tsx

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useCallback, useEffect, useMemo, useRef } from 'react';
22
import { off, on } from '../../_util/listener';
3-
import { getRefDom, mergeRefs, supportNodeRef } from '../../_util/ref';
3+
import { getNodeRef, getRefDom, mergeRefs, supportNodeRef } from '../../_util/ref';
44
import useConfig from '../../hooks/useConfig';
55

66
const ESC_KEY = 'Escape';
@@ -21,12 +21,12 @@ export default function useTrigger({
2121

2222
const triggerRef = useRef<HTMLElement>(null);
2323
const visibleTimer = useRef(null);
24-
const leaveFlag = useRef(false);
24+
const leaveFlag = useRef(false); // 防止多次触发显隐
2525

2626
// 禁用和无内容时不展示
2727
const shouldToggle = useMemo(() => {
2828
if (disabled) return false;
29-
return !disabled && content === 0 ? true : content;
29+
return !!content;
3030
}, [disabled, content]);
3131

3232
// 解析 delay 数据类型
@@ -45,9 +45,9 @@ export default function useTrigger({
4545
}
4646

4747
const getTriggerElement = useCallback(() => {
48-
let element: HTMLElement;
48+
let element: HTMLElement | null = null;
4949
if (triggerElementIsString) {
50-
element = document.querySelector(children) as HTMLElement;
50+
element = document.querySelector(children);
5151
} else {
5252
element = getRefDom(triggerRef);
5353
}
@@ -63,7 +63,8 @@ export default function useTrigger({
6363

6464
const handleClick = (e: MouseEvent) => {
6565
const target = e.target as HTMLElement;
66-
// https://github.com/Tencent/tdesign-react/issues/2320
66+
// Fix: https://github.com/Tencent/tdesign-react/issues/2320
67+
// 点击 clear icon 是否触发 Popup 显隐切换的逻辑交给具体逻辑自己处理,避免重复触发
6768
const isClearIcon =
6869
target?.closest?.(`.${classPrefix}-input__suffix-clear`) ||
6970
target?.closest?.(`.${classPrefix}-tag-input__suffix-clear`);
@@ -162,7 +163,6 @@ export default function useTrigger({
162163
on(element, 'contextmenu', handleContextMenu);
163164
on(element, 'touchstart', handleTouchStart, { passive: true });
164165
on(element, 'keydown', handleKeyDown);
165-
166166
return () => {
167167
off(element, 'click', handleClick);
168168
off(element, 'mousedown', handleMouseDown);
@@ -195,18 +195,13 @@ export default function useTrigger({
195195

196196
useEffect(() => {
197197
const element = getTriggerElement();
198-
if (!element || !document.contains(element)) return;
199-
200198
if (visible) {
201-
element.classList.add(`${classPrefix}-popup-open`);
199+
element?.classList.add(`${classPrefix}-popup-open`);
202200
} else {
203-
element.classList.remove(`${classPrefix}-popup-open`);
201+
element?.classList.remove(`${classPrefix}-popup-open`);
204202
}
205-
206203
return () => {
207-
if (element && document.contains(element)) {
208-
element.classList.remove(`${classPrefix}-popup-open`);
209-
}
204+
element?.classList.remove(`${classPrefix}-popup-open`);
210205
};
211206
}, [visible, classPrefix, getTriggerElement]);
212207

@@ -221,7 +216,7 @@ export default function useTrigger({
221216
if (triggerElementIsString) return;
222217

223218
if (supportNodeRef(children)) {
224-
const childRef = (children as any).ref;
219+
const childRef = getNodeRef(children);
225220
const mergedRef = childRef ? mergeRefs(triggerRef, childRef) : triggerRef;
226221
return React.cloneElement(children, { ref: mergedRef });
227222
}

0 commit comments

Comments
 (0)