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 22:11:03 +09:00
committed by GitHub
parent e343c7a970
commit ea75a968ce
2 changed files with 49 additions and 18 deletions

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.forEach((options, index) => {
(columns) => { if (
columns.forEach((options, index) => { options.length &&
if ( !isOptionExist(options, selectedValues.value[index], fields.value)
options.length && ) {
!isOptionExist(options, selectedValues.value[index], fields.value) setValue(index, getFirstEnabledOption(options)![fields.value.value]);
) { }
setValue( });
index, };
getFirstEnabledOption(options)![fields.value.value],
); watch(currentColumns, (columns) => resetSelectedValues(columns), {
} immediate: true,
}); });
},
{ 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,

View File

@@ -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],
},
]);
});