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