From a2c6de3de0113aee45061632f1450c97cbbc8cd5 Mon Sep 17 00:00:00 2001 From: imoctopus Date: Tue, 28 Jun 2022 20:40:24 +0800 Subject: [PATCH 1/2] fix: onClear triggers onDeselect in multiple mode --- src/BaseSelect.tsx | 4 +++- src/Select.tsx | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) 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); }); } }; From bd83a02cd5ea9f9a22dade012bea98ce9287f7f8 Mon Sep 17 00:00:00 2001 From: imoctopus Date: Tue, 28 Jun 2022 20:42:05 +0800 Subject: [PATCH 2/2] test: add test --- tests/shared/allowClearTest.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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(