|
1 | 1 | import classNames from 'classnames'; |
2 | 2 | import type { CSSMotionProps } from '@rc-component/motion'; |
3 | 3 | import 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 | 5 | import isEqual from '@rc-component/util/lib/isEqual'; |
6 | 6 | import warning from '@rc-component/util/lib/warning'; |
7 | 7 | import * as React from 'react'; |
@@ -273,10 +273,8 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => { |
273 | 273 | } |
274 | 274 |
|
275 | 275 | // ========================= 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; |
280 | 278 |
|
281 | 279 | // React 18 will merge mouse event which means we open key will not sync |
282 | 280 | // ref: https://github.com/ant-design/ant-design/issues/38818 |
@@ -376,11 +374,9 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => { |
376 | 374 | }, [lastVisibleIndex, allVisible]); |
377 | 375 |
|
378 | 376 | // ======================== Active ======================== |
379 | | - const [mergedActiveKey, setMergedActiveKey] = useMergedState( |
| 377 | + const [mergedActiveKey, setMergedActiveKey] = useControlledState( |
380 | 378 | activeKey || ((defaultActiveFirst && childList[0]?.key) as string), |
381 | | - { |
382 | | - value: activeKey, |
383 | | - }, |
| 379 | + activeKey, |
384 | 380 | ); |
385 | 381 |
|
386 | 382 | const onActive = useMemoCallback((key: string) => { |
@@ -423,22 +419,21 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => { |
423 | 419 |
|
424 | 420 | // ======================== Select ======================== |
425 | 421 | // >>>>> 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 | + } |
434 | 430 |
|
435 | | - if (keys === null || keys === undefined) { |
436 | | - return EMPTY_LIST; |
437 | | - } |
| 431 | + if (internalSelectKeys === null || internalSelectKeys === undefined) { |
| 432 | + return EMPTY_LIST; |
| 433 | + } |
438 | 434 |
|
439 | | - return [keys]; |
440 | | - }, |
441 | | - }); |
| 435 | + return [internalSelectKeys]; |
| 436 | + }, [internalSelectKeys]); |
442 | 437 |
|
443 | 438 | // >>>>> Trigger select |
444 | 439 | const triggerSelection = (info: MenuInfo) => { |
|
0 commit comments