diff --git a/src/hooks/useDelayReset.ts b/src/hooks/useDelayReset.ts index 09001544..a8b40033 100644 --- a/src/hooks/useDelayReset.ts +++ b/src/hooks/useDelayReset.ts @@ -14,17 +14,26 @@ export default function useDelayReset( window.clearTimeout(delayRef.current); }; - React.useEffect(() => cancelLatest, []); + React.useEffect(() => { + return () => { + cancelLatest(); + }; + }, []); - const delaySetBool = (value: boolean, callback: () => void) => { + const delaySetBool = (value: boolean, callback?: () => void) => { cancelLatest(); - delayRef.current = window.setTimeout(() => { - setBool(value); - if (callback) { - callback(); - } - }, timeout); + if (value === true) { + // true 值立即设置 + setBool(true); + callback?.(); + } else { + // false 值延迟设置 + delayRef.current = window.setTimeout(() => { + setBool(false); + callback?.(); + }, timeout); + } }; return [bool, delaySetBool, cancelLatest]; diff --git a/tests/Select.test.tsx b/tests/Select.test.tsx index ce171225..5392d4a5 100644 --- a/tests/Select.test.tsx +++ b/tests/Select.test.tsx @@ -10,7 +10,7 @@ import KeyCode from '@rc-component/util/lib/KeyCode'; import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; import { resetWarned } from '@rc-component/util/lib/warning'; import type { ScrollConfig } from 'rc-virtual-list/lib/List'; -import React from 'react'; +import React, { StrictMode } from 'react'; import type { SelectProps } from '../src'; import Select, { OptGroup, Option, useBaseProps } from '../src'; import BaseSelect from '../src/BaseSelect'; @@ -2670,5 +2670,17 @@ describe('Select.Basic', () => { expect(inputNode).toHaveAttribute('readonly'); } }); + + it('should has focus class when focus', () => { + const { container } = render( + +