From 9d08000800aff8aaaf65395539915f0c454dea81 Mon Sep 17 00:00:00 2001 From: afc163 Date: Thu, 27 Oct 2022 21:14:26 +0800 Subject: [PATCH] Revert "fix: SubMenu in React18 sync problem (#537)" This reverts commit 0cf3d90cca69d46266c1324edc0c0f793e844f0d. --- src/Menu.tsx | 19 +++++++------------ tests/React18.spec.tsx | 37 +------------------------------------ tests/util.ts | 11 ----------- 3 files changed, 8 insertions(+), 59 deletions(-) diff --git a/src/Menu.tsx b/src/Menu.tsx index b4c12434..5b490b8e 100644 --- a/src/Menu.tsx +++ b/src/Menu.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -import { flushSync } from 'react-dom'; import type { CSSMotionProps } from 'rc-motion'; import classNames from 'classnames'; import shallowEqual from 'shallowequal'; @@ -272,18 +271,13 @@ const Menu = React.forwardRef((props, ref) => { }); const triggerOpenKeys = (keys: string[]) => { - // Prevent React18 auto batch since trigger openKeys on same time - // which makes mergedOpenKeys closure problem - flushSync(() => { - setMergedOpenKeys(keys); - }); + setMergedOpenKeys(keys); onOpenChange?.(keys); }; // >>>>> Cache & Reset open keys when inlineCollapsed changed - const [inlineCacheOpenKeys, setInlineCacheOpenKeys] = React.useState( - mergedOpenKeys, - ); + const [inlineCacheOpenKeys, setInlineCacheOpenKeys] = + React.useState(mergedOpenKeys); const isInlineMode = mergedMode === 'inline'; @@ -335,9 +329,10 @@ const Menu = React.forwardRef((props, ref) => { [registerPath, unregisterPath], ); - const pathUserContext = React.useMemo(() => ({ isSubPathKey }), [ - isSubPathKey, - ]); + const pathUserContext = React.useMemo( + () => ({ isSubPathKey }), + [isSubPathKey], + ); React.useEffect(() => { refreshOverflowKeys( diff --git a/tests/React18.spec.tsx b/tests/React18.spec.tsx index a263a15c..33160caa 100644 --- a/tests/React18.spec.tsx +++ b/tests/React18.spec.tsx @@ -1,7 +1,6 @@ /* eslint-disable no-undef */ import React from 'react'; -import { act, fireEvent, render } from '@testing-library/react'; -import { sleep } from './util'; +import { act, render } from '@testing-library/react'; import Menu, { MenuItem, SubMenu } from '../src'; import type { MenuProps } from '../src'; @@ -56,39 +55,5 @@ describe('React18', () => { .querySelector('.rc-menu-submenu-title').textContent, ).toEqual('submenu1'); }); - - it('prevent React 18 auto batch', async () => { - const handleOpenChange = jest.fn(); - const { container } = render( - - - 1 - - - 2 - - , - ); - - // Enter - fireEvent.mouseEnter(container.querySelector('.rc-menu-submenu-title')); - runAllTimer(); - expect(container.querySelector('.rc-menu-submenu-open')).toBeTruthy(); - // Leave - fireEvent.mouseLeave(container.querySelector('.rc-menu-submenu-title')); - act(() => { - jest.runAllTimers(); - }); - expect(container.querySelector('.rc-menu-submenu-open')).toBeFalsy(); - await act(async () => { - await sleep(); - }); - // Enter - fireEvent.mouseEnter( - container.querySelectorAll('.rc-menu-submenu-title')[1], - ); - jest.runAllTimers(); - expect(container.querySelector('.rc-menu-submenu-open')).toBeTruthy(); - }); }); /* eslint-enable */ diff --git a/tests/util.ts b/tests/util.ts index 10000a08..25094366 100644 --- a/tests/util.ts +++ b/tests/util.ts @@ -1,4 +1,3 @@ -import { act } from '@testing-library/react'; export function isActive(container: HTMLElement, index: number, active = true) { const checker = expect(container.querySelectorAll('li.rc-menu-item')[index]); @@ -12,13 +11,3 @@ export function isActive(container: HTMLElement, index: number, active = true) { export function last(elements: NodeListOf) { return elements[elements.length - 1]; } - -const globalTimeout = global.setTimeout; - -export const sleep = async (timeout = 0) => { - await act(async () => { - await new Promise(resolve => { - globalTimeout(resolve, timeout); - }); - }); -};