11import React , { useCallback , useEffect , useMemo , useRef } from 'react' ;
22import { off , on } from '../../_util/listener' ;
3- import { getRefDom , mergeRefs , supportNodeRef } from '../../_util/ref' ;
3+ import { getNodeRef , getRefDom , mergeRefs , supportNodeRef } from '../../_util/ref' ;
44import useConfig from '../../hooks/useConfig' ;
55
66const 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