fix(Picker): make sure confirm params' behavior consistent (#13423) (#13425)

Signed-off-by: Kayne <w.zengkai@gmail.com>
This commit is contained in:
KayneWang
2025-04-20 21:11:03 +08:00
committed by GitHub
parent e343c7a970
commit ea75a968ce
2 changed files with 49 additions and 18 deletions
+10 -11
View File
@@ -147,7 +147,9 @@ export default defineComponent({
}; };
const getEventParams = () => ({ const getEventParams = () => ({
selectedValues: selectedValues.value.slice(0), selectedValues: selectedValues.value.length
? selectedValues.value.slice(0)
: resetSelectedValues(currentColumns.value),
selectedOptions: selectedOptions.value, selectedOptions: selectedOptions.value,
selectedIndexes: selectedIndexes.value, selectedIndexes: selectedIndexes.value,
}); });
@@ -268,23 +270,20 @@ export default defineComponent({
} }
}; };
watch( const resetSelectedValues = (columns: PickerColumn[]) => {
currentColumns,
(columns) => {
columns.forEach((options, index) => { columns.forEach((options, index) => {
if ( if (
options.length && options.length &&
!isOptionExist(options, selectedValues.value[index], fields.value) !isOptionExist(options, selectedValues.value[index], fields.value)
) { ) {
setValue( setValue(index, getFirstEnabledOption(options)![fields.value.value]);
index,
getFirstEnabledOption(options)![fields.value.value],
);
} }
}); });
}, };
{ immediate: true },
); watch(currentColumns, (columns) => resetSelectedValues(columns), {
immediate: true,
});
// preserve last emitted model value // preserve last emitted model value
// when props.modelValue is updated by parent component, // when props.modelValue is updated by parent component,
@@ -489,3 +489,35 @@ test('should emit correct values when clicking confirm button during column scro
}, },
]); ]);
}); });
test('should emit default values when clear modelValue', async () => {
const columns = [
{ text: '1', value: '1' },
{ text: '2', value: '2' },
];
const wrapper = mount({
setup() {
const modelValue = ref(['1']);
return () => (
<>
<button
class="clear-button"
onClick={() => (modelValue.value = [])}
/>
<Picker v-model={modelValue.value} columns={columns} />
</>
);
},
});
const button = wrapper.find('.clear-button');
await button.trigger('click');
const picker = wrapper.findComponent(Picker);
await picker.find('.van-picker__confirm').trigger('click');
expect(picker.emitted('confirm')![0]).toEqual([
{
selectedOptions: [{ text: '1', value: '1' }],
selectedValues: ['1'],
selectedIndexes: [0],
},
]);
});