Skip to content

Commit f94fe00

Browse files
authoredDec 4, 2022
fix: force trigger mouse event change (#562)
1 parent cd7f11b commit f94fe00

File tree

1 file changed

+37
-24
lines changed

1 file changed

+37
-24
lines changed
 

‎src/Menu.tsx‎

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
1-
import * as React from 'react';
2-
import type { CSSMotionProps } from 'rc-motion';
31
import classNames from 'classnames';
4-
import shallowEqual from 'shallowequal';
2+
import type { CSSMotionProps } from 'rc-motion';
3+
import Overflow from 'rc-overflow';
54
import useMergedState from 'rc-util/lib/hooks/useMergedState';
65
import 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';
818
import 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';
2030
import MenuItem from './MenuItem';
31+
import SubMenu from './SubMenu';
2132
import { parseItems } from './utils/nodeUtil';
22-
import MenuContextProvider from './context/MenuContext';
23-
import useMemoCallback from './hooks/useMemoCallback';
2433
import { 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

Comments
 (0)
Please sign in to comment.