@@ -10,6 +10,8 @@ import useLayoutEffect from 'rc-util/lib/hooks/useLayoutEffect';
10
10
import isMobile from 'rc-util/lib/isMobile' ;
11
11
import * as React from 'react' ;
12
12
import { flushSync } from 'react-dom' ;
13
+ import Popup from './Popup' ;
14
+ import TriggerWrapper from './TriggerWrapper' ;
13
15
import type { TriggerContextProps } from './context' ;
14
16
import TriggerContext from './context' ;
15
17
import useAction from './hooks/useAction' ;
@@ -25,18 +27,17 @@ import type {
25
27
BuildInPlacements ,
26
28
TransitionNameType ,
27
29
} from './interface' ;
28
- import Popup from './Popup' ;
29
- import TriggerWrapper from './TriggerWrapper' ;
30
30
import { getAlignPopupClassName , getMotion } from './util' ;
31
31
32
32
export type {
33
- BuildInPlacements ,
34
- AlignType ,
35
33
ActionType ,
34
+ AlignType ,
36
35
ArrowTypeOuter as ArrowType ,
36
+ BuildInPlacements ,
37
37
} ;
38
38
39
39
export interface TriggerRef {
40
+ nativeElement : HTMLElement ;
40
41
forceAlign : VoidFunction ;
41
42
}
42
43
@@ -251,9 +252,13 @@ export function generateTrigger(
251
252
// Use state to control here since `useRef` update not trigger render
252
253
const [ targetEle , setTargetEle ] = React . useState < HTMLElement > ( null ) ;
253
254
255
+ // Used for forwardRef target. Not use internal
256
+ const externalForwardRef = React . useRef < HTMLElement > ( null ) ;
257
+
254
258
const setTargetRef = useEvent ( ( node : HTMLElement ) => {
255
259
if ( isDOM ( node ) && targetEle !== node ) {
256
260
setTargetEle ( node ) ;
261
+ externalForwardRef . current = node ;
257
262
}
258
263
} ) ;
259
264
@@ -448,7 +453,9 @@ export function generateTrigger(
448
453
alignPoint ,
449
454
] ) ;
450
455
456
+ // ============================ Refs ============================
451
457
React . useImperativeHandle ( ref , ( ) => ( {
458
+ nativeElement : externalForwardRef . current ,
452
459
forceAlign : triggerAlign ,
453
460
} ) ) ;
454
461
0 commit comments