diff --git a/src/BaseSelect.tsx b/src/BaseSelect.tsx index 8907176be..468e6fdca 100644 --- a/src/BaseSelect.tsx +++ b/src/BaseSelect.tsx @@ -43,6 +43,8 @@ export type Placement = 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight'; export type RawValueType = string | number; +export type DisplayInfoType = 'add' | 'remove' | 'clear'; + export interface RefOptionListProps { onKeyDown: React.KeyboardEventHandler; onKeyUp: React.KeyboardEventHandler; @@ -81,7 +83,7 @@ export interface BaseSelectPrivateProps { onDisplayValuesChange: ( values: DisplayValueType[], info: { - type: 'add' | 'remove' | 'clear'; + type: DisplayInfoType; values: DisplayValueType[]; }, ) => void; diff --git a/src/Select.tsx b/src/Select.tsx index 46fbaf51e..1a17dbcba 100644 --- a/src/Select.tsx +++ b/src/Select.tsx @@ -36,6 +36,7 @@ import type { BaseSelectProps, BaseSelectPropsWithoutPrivate, BaseSelectRef, + DisplayInfoType, DisplayValueType, RenderNode, } from './BaseSelect'; @@ -455,7 +456,7 @@ const Select = React.forwardRef( ); // ========================= OptionList ========================= - const triggerSelect = (val: RawValueType, selected: boolean) => { + const triggerSelect = (val: RawValueType, selected: boolean, type?: DisplayInfoType) => { const getSelectEnt = (): [RawValueType | LabelInValueType, DefaultOptionType] => { const option = getMixedOption(val); return [ @@ -473,7 +474,7 @@ const Select = React.forwardRef( if (selected && onSelect) { const [wrappedValue, option] = getSelectEnt(); onSelect(wrappedValue, option); - } else if (!selected && onDeselect) { + } else if (!selected && onDeselect && type !== 'clear') { const [wrappedValue, option] = getSelectEnt(); onDeselect(wrappedValue, option); } @@ -509,10 +510,11 @@ const Select = React.forwardRef( // BaseSelect display values change const onDisplayValuesChange: BaseSelectProps['onDisplayValuesChange'] = (nextValues, info) => { triggerChange(nextValues); + const { type, values } = info; - if (info.type === 'remove' || info.type === 'clear') { - info.values.forEach((item) => { - triggerSelect(item.value, false); + if (type === 'remove' || type === 'clear') { + values.forEach((item) => { + triggerSelect(item.value, false, type); }); } }; diff --git a/tests/shared/allowClearTest.tsx b/tests/shared/allowClearTest.tsx index e3da6d3d8..eb968bf42 100644 --- a/tests/shared/allowClearTest.tsx +++ b/tests/shared/allowClearTest.tsx @@ -11,6 +11,7 @@ export default function allowClearTest(mode: any, value: any) { it('clears value', () => { const onClear = jest.fn(); const onChange = jest.fn(); + const onDeselect = jest.fn(); const useArrayValue = ['tags', 'multiple'].includes(mode); const wrapper = mount(