1- import * as React from 'react' ;
2- import type { CSSMotionProps } from 'rc-motion' ;
31import classNames from 'classnames' ;
4- import shallowEqual from 'shallowequal' ;
2+ import type { CSSMotionProps } from 'rc-motion' ;
3+ import Overflow from 'rc-overflow' ;
54import useMergedState from 'rc-util/lib/hooks/useMergedState' ;
65import warning from 'rc-util/lib/warning' ;
7- import Overflow from 'rc-overflow' ;
6+ import * as React from 'react' ;
7+ import { useImperativeHandle } from 'react' ;
8+ import { flushSync } from 'react-dom' ;
9+ import shallowEqual from 'shallowequal' ;
10+ import { getMenuId , IdContext } from './context/IdContext' ;
11+ import MenuContextProvider from './context/MenuContext' ;
12+ import { PathRegisterContext , PathUserContext } from './context/PathContext' ;
13+ import PrivateContext from './context/PrivateContext' ;
14+ import useAccessibility from './hooks/useAccessibility' ;
15+ import useKeyRecords , { OVERFLOW_KEY } from './hooks/useKeyRecords' ;
16+ import useMemoCallback from './hooks/useMemoCallback' ;
17+ import useUUID from './hooks/useUUID' ;
818import type {
919 BuiltinPlacements ,
20+ ItemType ,
1021 MenuClickEventHandler ,
1122 MenuInfo ,
1223 MenuMode ,
24+ MenuRef ,
25+ RenderIconType ,
1326 SelectEventHandler ,
14- TriggerSubMenuAction ,
1527 SelectInfo ,
16- RenderIconType ,
17- ItemType ,
18- MenuRef ,
28+ TriggerSubMenuAction ,
1929} from './interface' ;
2030import MenuItem from './MenuItem' ;
31+ import SubMenu from './SubMenu' ;
2132import { parseItems } from './utils/nodeUtil' ;
22- import MenuContextProvider from './context/MenuContext' ;
23- import useMemoCallback from './hooks/useMemoCallback' ;
2433import { warnItemProp } from './utils/warnUtil' ;
25- import SubMenu from './SubMenu' ;
26- import useAccessibility from './hooks/useAccessibility' ;
27- import useUUID from './hooks/useUUID' ;
28- import { PathRegisterContext , PathUserContext } from './context/PathContext' ;
29- import useKeyRecords , { OVERFLOW_KEY } from './hooks/useKeyRecords' ;
30- import { getMenuId , IdContext } from './context/IdContext' ;
31- import PrivateContext from './context/PrivateContext' ;
32- import { useImperativeHandle } from 'react' ;
3334
3435/**
3536 * Menu modify after refactor:
@@ -253,9 +254,19 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
253254 postState : keys => keys || EMPTY_LIST ,
254255 } ) ;
255256
256- const triggerOpenKeys = ( keys : string [ ] ) => {
257- setMergedOpenKeys ( keys ) ;
258- onOpenChange ?.( keys ) ;
257+ // React 18 will merge mouse event which means we open key will not sync
258+ // ref: https://github.com/ant-design/ant-design/issues/38818
259+ const triggerOpenKeys = ( keys : string [ ] , forceFlush = false ) => {
260+ function doUpdate ( ) {
261+ setMergedOpenKeys ( keys ) ;
262+ onOpenChange ?.( keys ) ;
263+ }
264+
265+ if ( forceFlush ) {
266+ flushSync ( doUpdate ) ;
267+ } else {
268+ doUpdate ( ) ;
269+ }
259270 } ;
260271
261272 // >>>>> Cache & Reset open keys when inlineCollapsed changed
@@ -277,11 +288,13 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
277288 const isInlineMode = mergedMode === 'inline' ;
278289
279290 const [ internalMode , setInternalMode ] = React . useState ( mergedMode ) ;
280- const [ internalInlineCollapsed , setInternalInlineCollapsed ] = React . useState ( mergedInlineCollapsed ) ;
291+ const [ internalInlineCollapsed , setInternalInlineCollapsed ] = React . useState (
292+ mergedInlineCollapsed ,
293+ ) ;
281294
282295 React . useEffect ( ( ) => {
283296 setInternalMode ( mergedMode ) ;
284- setInternalInlineCollapsed ( mergedInlineCollapsed )
297+ setInternalInlineCollapsed ( mergedInlineCollapsed ) ;
285298
286299 if ( ! mountRef . current ) {
287300 return ;
@@ -462,7 +475,7 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
462475 }
463476
464477 if ( ! shallowEqual ( mergedOpenKeys , newOpenKeys ) ) {
465- triggerOpenKeys ( newOpenKeys ) ;
478+ triggerOpenKeys ( newOpenKeys , true ) ;
466479 }
467480 } ) ;
468481
0 commit comments