From 3dc20ad39e0df424f3012b7b92a21345e58c92ed Mon Sep 17 00:00:00 2001 From: Jeff Wang <229298746@qq.com> Date: Sun, 23 Mar 2025 10:18:52 +0800 Subject: [PATCH] fix(Picker): ensure that the confirm event params are up to date (#13381) Co-authored-by: inottn --- packages/vant/src/picker/Picker.tsx | 1 + packages/vant/src/picker/test/index.spec.tsx | 51 +++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/packages/vant/src/picker/Picker.tsx b/packages/vant/src/picker/Picker.tsx index 001cd763d..81ee1b80e 100644 --- a/packages/vant/src/picker/Picker.tsx +++ b/packages/vant/src/picker/Picker.tsx @@ -189,6 +189,7 @@ export default defineComponent({ // wait nextTick to ensure the model value is update to date // when confirm event is emitted nextTick(() => { + const params = getEventParams(); emit('confirm', params); }); diff --git a/packages/vant/src/picker/test/index.spec.tsx b/packages/vant/src/picker/test/index.spec.tsx index 17ecdab92..29a23ea34 100644 --- a/packages/vant/src/picker/test/index.spec.tsx +++ b/packages/vant/src/picker/test/index.spec.tsx @@ -1,5 +1,6 @@ import { later, mount, triggerDrag } from '../../../test'; -import { Picker, type PickerConfirmEventParams } from '..'; +import { Picker, type PickerOption, type PickerConfirmEventParams } from '..'; +import { computed, ref } from 'vue'; const simpleColumn = [ { text: '1990', value: '1990' }, @@ -440,3 +441,51 @@ test('should render empty slot when options is empty', async () => { await wrapper.setProps({ columns: [{ values: ['foo'] }] }); expect(wrapper.html()).not.toContain('empty content'); }); + +test('should emit correct values when clicking confirm button during column scrolling', async () => { + const columnsOne: PickerOption[] = [ + { text: 'Beijing', value: 'Beijing' }, + { text: 'Shanghai', value: 'Shanghai' }, + ]; + const columnsTwo: Record = { + Beijing: [ + { text: 'Dongcheng', value: 'Dongcheng' }, + { text: 'Xicheng', value: 'Xicheng' }, + { text: 'Chaoyang', value: 'Chaoyang' }, + { text: 'Haidian', value: 'Haidian' }, + ], + Shanghai: [ + { text: 'Huangpu', value: 'Huangpu' }, + { text: 'Xuhui', value: 'Xuhui' }, + { text: 'Changning', value: 'Changning' }, + { text: 'Pudong', value: 'Pudong' }, + ], + }; + const currentValues = ref(['Beijing', 'Dongcheng']); + const wrapper = mount({ + setup() { + const columns = computed(() => [ + columnsOne, + columnsTwo[currentValues.value[0]], + ]); + return () => ( + + ); + }, + }); + const picker = wrapper.findComponent(Picker); + // Scroll to select "Shanghai" + triggerDrag(picker.findAll('.van-picker-column')[0], 0, -100); + // Trigger confirm immediately without waiting for scroll animation to complete + await picker.find('.van-picker__confirm').trigger('click'); + expect(picker.emitted('confirm')![0]).toEqual([ + { + selectedOptions: [ + { text: 'Shanghai', value: 'Shanghai' }, + { text: 'Huangpu', value: 'Huangpu' }, + ], + selectedValues: ['Shanghai', 'Huangpu'], + selectedIndexes: [1, 0], + }, + ]); +});