Skip to content

Commit 5921af4

Browse files
authored
Revert "fix: SubMenu in React18 sync problem (#537)" (#540)
This reverts commit 0cf3d90.
1 parent cb2f232 commit 5921af4

File tree

3 files changed

+8
-59
lines changed

3 files changed

+8
-59
lines changed

src/Menu.tsx

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as React from 'react';
2-
import { flushSync } from 'react-dom';
32
import type { CSSMotionProps } from 'rc-motion';
43
import classNames from 'classnames';
54
import shallowEqual from 'shallowequal';
@@ -272,18 +271,13 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
272271
});
273272

274273
const triggerOpenKeys = (keys: string[]) => {
275-
// Prevent React18 auto batch since trigger openKeys on same time
276-
// which makes mergedOpenKeys closure problem
277-
flushSync(() => {
278-
setMergedOpenKeys(keys);
279-
});
274+
setMergedOpenKeys(keys);
280275
onOpenChange?.(keys);
281276
};
282277

283278
// >>>>> Cache & Reset open keys when inlineCollapsed changed
284-
const [inlineCacheOpenKeys, setInlineCacheOpenKeys] = React.useState(
285-
mergedOpenKeys,
286-
);
279+
const [inlineCacheOpenKeys, setInlineCacheOpenKeys] =
280+
React.useState(mergedOpenKeys);
287281

288282
const isInlineMode = mergedMode === 'inline';
289283

@@ -335,9 +329,10 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
335329
[registerPath, unregisterPath],
336330
);
337331

338-
const pathUserContext = React.useMemo(() => ({ isSubPathKey }), [
339-
isSubPathKey,
340-
]);
332+
const pathUserContext = React.useMemo(
333+
() => ({ isSubPathKey }),
334+
[isSubPathKey],
335+
);
341336

342337
React.useEffect(() => {
343338
refreshOverflowKeys(

tests/React18.spec.tsx

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
/* eslint-disable no-undef */
22
import React from 'react';
3-
import { act, fireEvent, render } from '@testing-library/react';
4-
import { sleep } from './util';
3+
import { act, render } from '@testing-library/react';
54
import Menu, { MenuItem, SubMenu } from '../src';
65
import type { MenuProps } from '../src';
76

@@ -56,39 +55,5 @@ describe('React18', () => {
5655
.querySelector('.rc-menu-submenu-title').textContent,
5756
).toEqual('submenu1');
5857
});
59-
60-
it('prevent React 18 auto batch', async () => {
61-
const handleOpenChange = jest.fn();
62-
const { container } = render(
63-
<Menu onOpenChange={handleOpenChange}>
64-
<SubMenu title="s1">
65-
<MenuItem key="1">1</MenuItem>
66-
</SubMenu>
67-
<SubMenu title="s2">
68-
<MenuItem key="2">2</MenuItem>
69-
</SubMenu>
70-
</Menu>,
71-
);
72-
73-
// Enter
74-
fireEvent.mouseEnter(container.querySelector('.rc-menu-submenu-title'));
75-
runAllTimer();
76-
expect(container.querySelector('.rc-menu-submenu-open')).toBeTruthy();
77-
// Leave
78-
fireEvent.mouseLeave(container.querySelector('.rc-menu-submenu-title'));
79-
act(() => {
80-
jest.runAllTimers();
81-
});
82-
expect(container.querySelector('.rc-menu-submenu-open')).toBeFalsy();
83-
await act(async () => {
84-
await sleep();
85-
});
86-
// Enter
87-
fireEvent.mouseEnter(
88-
container.querySelectorAll('.rc-menu-submenu-title')[1],
89-
);
90-
jest.runAllTimers();
91-
expect(container.querySelector('.rc-menu-submenu-open')).toBeTruthy();
92-
});
9358
});
9459
/* eslint-enable */

tests/util.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { act } from '@testing-library/react';
21
export function isActive(container: HTMLElement, index: number, active = true) {
32
const checker = expect(container.querySelectorAll('li.rc-menu-item')[index]);
43

@@ -12,13 +11,3 @@ export function isActive(container: HTMLElement, index: number, active = true) {
1211
export function last(elements: NodeListOf<Element>) {
1312
return elements[elements.length - 1];
1413
}
15-
16-
const globalTimeout = global.setTimeout;
17-
18-
export const sleep = async (timeout = 0) => {
19-
await act(async () => {
20-
await new Promise(resolve => {
21-
globalTimeout(resolve, timeout);
22-
});
23-
});
24-
};

0 commit comments

Comments
 (0)