Skip to content

Commit 36d6539

Browse files
EmilyyyLiu刘欢
andauthored
refactor: Upgrade utils and replace useMergedState (#793)
* refactor: Upgrade utils and replace useMergedState * refactor: useUUID replace useId * fix: coverage --------- Co-authored-by: 刘欢 <[email protected]>
1 parent c7f9880 commit 36d6539

File tree

10 files changed

+107
-133
lines changed

10 files changed

+107
-133
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"dependencies": {
4747
"@rc-component/motion": "^1.1.4",
4848
"@rc-component/trigger": "^3.0.0",
49-
"@rc-component/util": "^1.0.0",
49+
"@rc-component/util": "^1.3.0",
5050
"classnames": "2.x",
5151
"rc-overflow": "^1.3.1"
5252
},

src/Menu.tsx

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import classNames from 'classnames';
22
import type { CSSMotionProps } from '@rc-component/motion';
33
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+
import useId from '@rc-component/util/lib/hooks/useId';
56
import isEqual from '@rc-component/util/lib/isEqual';
67
import warning from '@rc-component/util/lib/warning';
78
import * as React from 'react';
@@ -14,7 +15,6 @@ import PrivateContext from './context/PrivateContext';
1415
import { getFocusableElements, refreshElements, useAccessibility } from './hooks/useAccessibility';
1516
import useKeyRecords, { OVERFLOW_KEY } from './hooks/useKeyRecords';
1617
import useMemoCallback from './hooks/useMemoCallback';
17-
import useUUID from './hooks/useUUID';
1818
import 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) => {

src/context/IdContext.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ import * as React from 'react';
33
export const IdContext = React.createContext<string>(null);
44

55
export function getMenuId(uuid: string, eventKey: string) {
6-
if (uuid === undefined) {
7-
return null;
8-
}
96
return `${uuid}-${eventKey}`;
107
}
118

src/hooks/useUUID.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.

tests/__snapshots__/Keyboard.spec.tsx.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ HTMLCollection [
1313
role="none"
1414
>
1515
<div
16-
aria-controls="rc-menu-uuid-test-light-popup"
16+
aria-controls="rc-menu-uuid-light-popup"
1717
aria-expanded="true"
1818
aria-haspopup="true"
1919
class="rc-menu-submenu-title"
20-
data-menu-id="rc-menu-uuid-test-light"
20+
data-menu-id="rc-menu-uuid-light"
2121
role="menuitem"
2222
style="padding-left: 24px;"
2323
tabindex="-1"
@@ -31,12 +31,12 @@ HTMLCollection [
3131
<ul
3232
class="rc-menu rc-menu-sub rc-menu-inline"
3333
data-menu-list="true"
34-
id="rc-menu-uuid-test-light-popup"
34+
id="rc-menu-uuid-light-popup"
3535
role="menu"
3636
>
3737
<li
3838
class="rc-menu-item"
39-
data-menu-id="rc-menu-uuid-test-bamboo"
39+
data-menu-id="rc-menu-uuid-bamboo"
4040
role="menuitem"
4141
style="padding-left: 48px;"
4242
tabindex="-1"

0 commit comments

Comments
 (0)