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