@@ -9,7 +9,6 @@ import useId from 'rc-util/lib/hooks/useId';
9
9
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
- import { flushSync } from 'react-dom' ;
13
12
import Popup from './Popup' ;
14
13
import TriggerWrapper from './TriggerWrapper' ;
15
14
import type { TriggerContextProps } from './context' ;
@@ -320,15 +319,22 @@ export function generateTrigger(
320
319
const openRef = React . useRef ( mergedOpen ) ;
321
320
openRef . current = mergedOpen ;
322
321
322
+ const lastTriggerRef = React . useRef < boolean [ ] > ( [ ] ) ;
323
+ lastTriggerRef . current = [ ] ;
324
+
323
325
const internalTriggerOpen = useEvent ( ( nextOpen : boolean ) => {
326
+ setMergedOpen ( nextOpen ) ;
327
+
324
328
// Enter or Pointer will both trigger open state change
325
329
// We only need take one to avoid duplicated change event trigger
326
- flushSync ( ( ) => {
327
- if ( mergedOpen !== nextOpen ) {
328
- setMergedOpen ( nextOpen ) ;
329
- onPopupVisibleChange ?.( nextOpen ) ;
330
- }
331
- } ) ;
330
+ // Use `lastTriggerRef` to record last open type
331
+ if (
332
+ ( lastTriggerRef . current [ lastTriggerRef . current . length - 1 ] ??
333
+ mergedOpen ) !== nextOpen
334
+ ) {
335
+ lastTriggerRef . current . push ( nextOpen ) ;
336
+ onPopupVisibleChange ?.( nextOpen ) ;
337
+ }
332
338
} ) ;
333
339
334
340
// Trigger for delay
0 commit comments