Skip to content

Commit b5fccbd

Browse files
Yuiai01dujiaqiMadCcc
authored
fix: trigger onBlur does not require reset focused (#980)
* fix: trigger onBlur does not require reset focused * chore: add test case * chore: update test case * Update tests/focus.test.tsx * Update tests/focus.test.tsx --------- Co-authored-by: dujiaqi <[email protected]> Co-authored-by: MadCcc <[email protected]>
1 parent 28a3dab commit b5fccbd

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

src/BaseSelect.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ const BaseSelect = React.forwardRef((props: BaseSelectProps, ref: React.Ref<Base
316316
const triggerRef = React.useRef<RefTriggerProps>(null);
317317
const selectorRef = React.useRef<RefSelectorProps>(null);
318318
const listRef = React.useRef<RefOptionListProps>(null);
319+
const blurRef = React.useRef<boolean>(false);
319320

320321
/** Used for component focused management */
321322
const [mockFocused, setMockFocused, cancelSetMockFocused] = useDelayReset();
@@ -451,7 +452,8 @@ const BaseSelect = React.forwardRef((props: BaseSelectProps, ref: React.Ref<Base
451452
setInnerOpen(false);
452453
}
453454

454-
if (disabled) {
455+
// After onBlur is triggered, the focused does not need to be reset
456+
if (disabled && !blurRef.current) {
455457
setMockFocused(false);
456458
}
457459
}, [disabled]);
@@ -561,8 +563,11 @@ const BaseSelect = React.forwardRef((props: BaseSelectProps, ref: React.Ref<Base
561563
};
562564

563565
const onContainerBlur: React.FocusEventHandler<HTMLElement> = (...args) => {
566+
blurRef.current = true;
567+
564568
setMockFocused(false, () => {
565569
focusRef.current = false;
570+
blurRef.current = false;
566571
onToggleOpen(false);
567572
});
568573

tests/focus.test.tsx

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { mount } from 'enzyme';
2-
import React from 'react';
2+
import React, { useState } from 'react';
33
import { act } from 'react-dom/test-utils';
44
import Select from '../src';
5+
import { fireEvent, render } from '@testing-library/react';
56

67
describe('Select.Focus', () => {
78
it('disabled should reset focused', () => {
@@ -31,6 +32,45 @@ describe('Select.Focus', () => {
3132
jest.useRealTimers();
3233
});
3334

35+
it('after onBlur is triggered the focused does not need to be reset', () => {
36+
jest.useFakeTimers();
37+
38+
const onFocus = jest.fn();
39+
40+
const Demo: React.FC = () => {
41+
const [disabled, setDisabled] = useState(false);
42+
return (
43+
<>
44+
<Select disabled={disabled} onFocus={onFocus} onBlur={() => setDisabled(true)} />
45+
<button onClick={() => setDisabled(false)} />
46+
</>
47+
);
48+
};
49+
50+
const { container } = render(<Demo />);
51+
52+
fireEvent.focus(container.querySelector('input'));
53+
jest.runAllTimers();
54+
55+
// trigger disabled
56+
fireEvent.blur(container.querySelector('input'));
57+
jest.runAllTimers();
58+
59+
// reset focused
60+
onFocus.mockReset();
61+
62+
expect(container.querySelector('.rc-select-disabled')).toBeTruthy();
63+
64+
// reset disabled
65+
fireEvent.click(container.querySelector('button'));
66+
fireEvent.focus(container.querySelector('input'));
67+
jest.runAllTimers();
68+
69+
expect(onFocus).toHaveBeenCalled();
70+
71+
jest.useRealTimers();
72+
});
73+
3474
it('IE focus', () => {
3575
jest.clearAllTimers();
3676
jest.useFakeTimers();

0 commit comments

Comments
 (0)