11import  classNames  from  'classnames' ; 
22import  type  {  CSSMotionProps  }  from  '@rc-component/motion' ; 
33import  Overflow  from  'rc-overflow' ; 
4- import  useMergedState  from  '@rc-component/util/lib/hooks/useMergedState' ; 
4+ import  useControlledState  from  '@rc-component/util/lib/hooks/useControlledState' ; 
5+ import  useId  from  '@rc-component/util/lib/hooks/useId' ; 
56import  isEqual  from  '@rc-component/util/lib/isEqual' ; 
67import  warning  from  '@rc-component/util/lib/warning' ; 
78import  *  as  React  from  'react' ; 
@@ -14,7 +15,6 @@ import PrivateContext from './context/PrivateContext';
1415import  {  getFocusableElements ,  refreshElements ,  useAccessibility  }  from  './hooks/useAccessibility' ; 
1516import  useKeyRecords ,  {  OVERFLOW_KEY  }  from  './hooks/useKeyRecords' ; 
1617import  useMemoCallback  from  './hooks/useMemoCallback' ; 
17- import  useUUID  from  './hooks/useUUID' ; 
1818import  type  { 
1919  BuiltinPlacements , 
2020  Components , 
@@ -260,7 +260,7 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
260260
261261  const  containerRef  =  React . useRef < HTMLUListElement > ( ) ; 
262262
263-   const  uuid  =  useUUID ( id ) ; 
263+   const  uuid  =  useId ( id  ?  `rc-menu-uuid- ${ id } `  :  'rc-menu-uuid' ) ; 
264264
265265  const  isRtl  =  direction  ===  'rtl' ; 
266266
@@ -273,10 +273,8 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
273273  } 
274274
275275  // ========================= Open ========================= 
276-   const  [ mergedOpenKeys ,  setMergedOpenKeys ]  =  useMergedState ( defaultOpenKeys ,  { 
277-     value : openKeys , 
278-     postState : keys  =>  keys  ||  EMPTY_LIST , 
279-   } ) ; 
276+   const  [ innerOpenKeys ,  setMergedOpenKeys ]  =  useControlledState ( defaultOpenKeys ,  openKeys ) ; 
277+   const  mergedOpenKeys  =  innerOpenKeys  ||  EMPTY_LIST ; 
280278
281279  // React 18 will merge mouse event which means we open key will not sync 
282280  // ref: https://github.com/ant-design/ant-design/issues/38818 
@@ -376,11 +374,9 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
376374  } ,  [ lastVisibleIndex ,  allVisible ] ) ; 
377375
378376  // ======================== Active ======================== 
379-   const  [ mergedActiveKey ,  setMergedActiveKey ]  =  useMergedState ( 
377+   const  [ mergedActiveKey ,  setMergedActiveKey ]  =  useControlledState ( 
380378    activeKey  ||  ( ( defaultActiveFirst  &&  childList [ 0 ] ?. key )  as  string ) , 
381-     { 
382-       value : activeKey , 
383-     } , 
379+     activeKey , 
384380  ) ; 
385381
386382  const  onActive  =  useMemoCallback ( ( key : string )  =>  { 
@@ -423,22 +419,21 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
423419
424420  // ======================== Select ======================== 
425421  // >>>>> Select keys 
426-   const  [ mergedSelectKeys ,  setMergedSelectKeys ]  =  useMergedState ( defaultSelectedKeys   ||   [ ] ,   { 
427-     value :  selectedKeys , 
428- 
429-      // Legacy convert key to array 
430-      postState :  keys  =>  { 
431-        if  ( Array . isArray ( keys ) )  { 
432-          return  keys ; 
433-        } 
422+   const  [ internalSelectKeys ,  setMergedSelectKeys ]  =  useControlledState ( 
423+     defaultSelectedKeys   ||   [ ] , 
424+      selectedKeys , 
425+   ) ; 
426+   const   mergedSelectKeys   =   React . useMemo ( ( )  =>  { 
427+     if  ( Array . isArray ( internalSelectKeys ) )  { 
428+       return  internalSelectKeys ; 
429+     } 
434430
435-        if  ( keys  ===  null  ||  keys  ===  undefined )  { 
436-          return  EMPTY_LIST ; 
437-        } 
431+     if  ( internalSelectKeys  ===  null  ||  internalSelectKeys  ===  undefined )  { 
432+       return  EMPTY_LIST ; 
433+     } 
438434
439-       return  [ keys ] ; 
440-     } , 
441-   } ) ; 
435+     return  [ internalSelectKeys ] ; 
436+   } ,  [ internalSelectKeys ] ) ; 
442437
443438  // >>>>> Trigger select 
444439  const  triggerSelection  =  ( info : MenuInfo )  =>  { 
0 commit comments