Skip to content

Commit de8f268

Browse files
authored
fix: onClear triggers onDeselect in multiple mode (#731)
* fix: onClear triggers onDeselect in multiple mode * test: add test
1 parent 2a07ffe commit de8f268

File tree

3 files changed

+14
-10
lines changed

3 files changed

+14
-10
lines changed

src/BaseSelect.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ export type Placement = 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight';
4343

4444
export type RawValueType = string | number;
4545

46+
export type DisplayInfoType = 'add' | 'remove' | 'clear';
47+
4648
export interface RefOptionListProps {
4749
onKeyDown: React.KeyboardEventHandler;
4850
onKeyUp: React.KeyboardEventHandler;
@@ -82,7 +84,7 @@ export interface BaseSelectPrivateProps {
8284
onDisplayValuesChange: (
8385
values: DisplayValueType[],
8486
info: {
85-
type: 'add' | 'remove' | 'clear';
87+
type: DisplayInfoType;
8688
values: DisplayValueType[];
8789
},
8890
) => void;

src/Select.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import type {
3636
BaseSelectProps,
3737
BaseSelectPropsWithoutPrivate,
3838
BaseSelectRef,
39+
DisplayInfoType,
3940
DisplayValueType,
4041
RenderNode,
4142
} from './BaseSelect';
@@ -455,7 +456,7 @@ const Select = React.forwardRef(
455456
);
456457

457458
// ========================= OptionList =========================
458-
const triggerSelect = (val: RawValueType, selected: boolean) => {
459+
const triggerSelect = (val: RawValueType, selected: boolean, type?: DisplayInfoType) => {
459460
const getSelectEnt = (): [RawValueType | LabelInValueType, DefaultOptionType] => {
460461
const option = getMixedOption(val);
461462
return [
@@ -473,7 +474,7 @@ const Select = React.forwardRef(
473474
if (selected && onSelect) {
474475
const [wrappedValue, option] = getSelectEnt();
475476
onSelect(wrappedValue, option);
476-
} else if (!selected && onDeselect) {
477+
} else if (!selected && onDeselect && type !== 'clear') {
477478
const [wrappedValue, option] = getSelectEnt();
478479
onDeselect(wrappedValue, option);
479480
}
@@ -509,10 +510,11 @@ const Select = React.forwardRef(
509510
// BaseSelect display values change
510511
const onDisplayValuesChange: BaseSelectProps['onDisplayValuesChange'] = (nextValues, info) => {
511512
triggerChange(nextValues);
513+
const { type, values } = info;
512514

513-
if (info.type === 'remove' || info.type === 'clear') {
514-
info.values.forEach((item) => {
515-
triggerSelect(item.value, false);
515+
if (type === 'remove' || type === 'clear') {
516+
values.forEach((item) => {
517+
triggerSelect(item.value, false, type);
516518
});
517519
}
518520
};

tests/shared/allowClearTest.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default function allowClearTest(mode: any, value: any) {
1111
it('clears value', () => {
1212
const onClear = jest.fn();
1313
const onChange = jest.fn();
14+
const onDeselect = jest.fn();
1415
const useArrayValue = ['tags', 'multiple'].includes(mode);
1516
const wrapper = mount(
1617
<Select
@@ -19,6 +20,7 @@ export default function allowClearTest(mode: any, value: any) {
1920
mode={mode}
2021
onClear={onClear}
2122
onChange={onChange}
23+
onDeselect={onDeselect}
2224
>
2325
<Option value="1">1</Option>
2426
<Option value="2">2</Option>
@@ -31,15 +33,13 @@ export default function allowClearTest(mode: any, value: any) {
3133

3234
// enabled
3335
wrapper.setProps({ disabled: false });
34-
wrapper
35-
.find('.rc-select-clear')
36-
.last()
37-
.simulate('mousedown');
36+
wrapper.find('.rc-select-clear').last().simulate('mousedown');
3837
if (useArrayValue) {
3938
expect(onChange).toHaveBeenCalledWith([], []);
4039
} else {
4140
expect(onChange).toHaveBeenCalledWith(undefined, undefined);
4241
}
42+
expect(onDeselect).not.toBeCalled();
4343
expect(wrapper.find('input').props().value).toEqual('');
4444
expect(onClear).toHaveBeenCalled();
4545
});

0 commit comments

Comments
 (0)