@@ -3,7 +3,7 @@ import classNames from 'classnames';
33import { debounce , isFunction } from 'lodash-es' ;
44import React , { forwardRef , useEffect , useImperativeHandle , useMemo , useRef , useState } from 'react' ;
55import { CSSTransition } from 'react-transition-group' ;
6- import { getRefDom } from '../_util/ref' ;
6+
77import { getCssVarsValue } from '../_util/style' ;
88import Portal from '../common/Portal' ;
99import useAnimation from '../hooks/useAnimation' ;
@@ -16,9 +16,10 @@ import usePopper from '../hooks/usePopper';
1616import useWindowSize from '../hooks/useWindowSize' ;
1717import { popupDefaultProps } from './defaultProps' ;
1818import useTrigger from './hooks/useTrigger' ;
19- import type { TdPopupProps } from './type' ;
2019import { getTransitionParams } from './utils/transition' ;
2120
21+ import type { TdPopupProps } from './type' ;
22+
2223export interface PopupProps extends TdPopupProps {
2324 // 是否触发展开收起动画,内部下拉式组件使用
2425 expandAnimation ?: boolean ;
@@ -72,7 +73,6 @@ const Popup = forwardRef<PopupRef, PopupProps>((originalProps, ref) => {
7273 const [ visible , onVisibleChange ] = useControlled ( props , 'visible' , props . onVisibleChange ) ;
7374
7475 const [ popupElement , setPopupElement ] = useState ( null ) ;
75- const triggerRef = useRef ( null ) ; // 记录 trigger 元素
7676 const popupRef = useRef ( null ) ; // popup dom 元素,css transition 需要用
7777 const portalRef = useRef ( null ) ; // portal dom 元素
7878 const contentRef = useRef ( null ) ; // 内容部分
@@ -100,18 +100,20 @@ const Popup = forwardRef<PopupRef, PopupProps>((originalProps, ref) => {
100100 [ placement ] ,
101101 ) ;
102102
103- const { getTriggerNode, getPopupProps, getTriggerDom } = useTrigger ( {
104- triggerRef,
103+ const { triggerElementIsString, getTriggerElement, getTriggerNode } = useTrigger ( {
104+ children,
105+ triggerElement,
105106 content,
106107 disabled,
107108 trigger,
108109 visible,
109110 delay,
110111 onVisibleChange,
111112 } ) ;
113+ const triggerEl = getTriggerElement ( ) ;
112114
113115 const popperOptions = props . popperOptions as Options ;
114- popperRef . current = usePopper ( getRefDom ( triggerRef ) , popupElement , {
116+ popperRef . current = usePopper ( triggerEl , popupElement , {
115117 placement : popperPlacement ,
116118 ...popperOptions ,
117119 } ) ;
@@ -128,8 +130,8 @@ const Popup = forwardRef<PopupRef, PopupProps>((originalProps, ref) => {
128130
129131 const updateTimeRef = useRef ( null ) ;
130132 // 监听 trigger 节点或内容变化动态更新 popup 定位
131- useMutationObserver ( getRefDom ( triggerRef ) , ( ) => {
132- const isDisplayNone = getCssVarsValue ( 'display' , getRefDom ( triggerRef ) ) === 'none' ;
133+ useMutationObserver ( triggerEl , ( ) => {
134+ const isDisplayNone = getCssVarsValue ( 'display' , triggerEl ) === 'none' ;
133135 if ( visible && ! isDisplayNone ) {
134136 clearTimeout ( updateTimeRef . current ) ;
135137 updateTimeRef . current = setTimeout ( ( ) => popperRef . current ?. update ?.( ) , 0 ) ;
@@ -146,11 +148,10 @@ const Popup = forwardRef<PopupRef, PopupProps>((originalProps, ref) => {
146148
147149 // 下拉展开时更新内部滚动条
148150 useEffect ( ( ) => {
149- if ( ! triggerRef . current ) triggerRef . current = getTriggerDom ( ) ;
150151 if ( visible ) {
151152 updateScrollTop ?.( contentRef . current ) ;
152153 }
153- } , [ visible , updateScrollTop , getTriggerDom ] ) ;
154+ } , [ visible , updateScrollTop ] ) ;
154155
155156 function handleExited ( ) {
156157 ! destroyOnClose && popupElement && ( popupElement . style . display = 'none' ) ;
@@ -175,8 +176,8 @@ const Popup = forwardRef<PopupRef, PopupProps>((originalProps, ref) => {
175176
176177 // 整理浮层样式
177178 function getOverlayStyle ( overlayStyle : TdPopupProps [ 'overlayStyle' ] ) {
178- if ( getRefDom ( triggerRef ) && popupRef . current && typeof overlayStyle === 'function' ) {
179- return { ...overlayStyle ( getRefDom ( triggerRef ) , popupRef . current ) } ;
179+ if ( triggerEl && popupRef . current && typeof overlayStyle === 'function' ) {
180+ return { ...overlayStyle ( triggerEl , popupRef . current ) } ;
180181 }
181182 return { ...overlayStyle } ;
182183 }
@@ -191,7 +192,7 @@ const Popup = forwardRef<PopupRef, PopupProps>((originalProps, ref) => {
191192 onEnter = { handleEnter }
192193 onExited = { handleExited }
193194 >
194- < Portal triggerNode = { getRefDom ( triggerRef ) } attach = { popupAttach } ref = { portalRef } >
195+ < Portal triggerNode = { triggerEl } attach = { popupAttach } ref = { portalRef } >
195196 < CSSTransition
196197 appear
197198 timeout = { 0 }
@@ -213,7 +214,6 @@ const Popup = forwardRef<PopupRef, PopupProps>((originalProps, ref) => {
213214 style = { { ...styles . popper , zIndex, ...getOverlayStyle ( overlayStyle ) } }
214215 className = { classNames ( `${ classPrefix } -popup` , overlayClassName ) }
215216 { ...attributes . popper }
216- { ...getPopupProps ( ) }
217217 onClick = { ( e ) => props . onOverlayClick ?.( { e } ) }
218218 >
219219 < div
@@ -227,6 +227,7 @@ const Popup = forwardRef<PopupRef, PopupProps>((originalProps, ref) => {
227227 ) }
228228 style = { getOverlayStyle ( overlayInnerStyle ) }
229229 onScroll = { handleScroll }
230+ // {...getPopupProps()}
230231 >
231232 { content }
232233 { showArrow && (
@@ -253,7 +254,7 @@ const Popup = forwardRef<PopupRef, PopupProps>((originalProps, ref) => {
253254
254255 return (
255256 < React . Fragment >
256- { triggerNode }
257+ { triggerElementIsString ? null : triggerNode }
257258 { overlay }
258259 </ React . Fragment >
259260 ) ;
0 commit comments