From 57d4b922eb7fac1a8eb575c9f3b054ab8eafa431 Mon Sep 17 00:00:00 2001 From: sukuki <129056169+msg-fobbit@users.noreply.github.com> Date: Thu, 23 Jan 2025 00:45:51 +0800 Subject: [PATCH] fix(select): optimize select-all logic to handle disabled options (#4947) * fix(select): optimize select-all logic to handle disabled options Closes #4937 * fix(select): optimize type annotations and variable naming Closes #4937 --- src/select/select.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/select/select.tsx b/src/select/select.tsx index 605973e26d..18971c95bc 100644 --- a/src/select/select.tsx +++ b/src/select/select.tsx @@ -210,10 +210,20 @@ export default defineComponent({ max: props.max, }); + /* + * 全选逻辑: + * 根据 checked 的值计算最终选中的值: + * - 如果 checked 为 true,则选中所有非 disabled 选项,并保留已选中的 disabled 选项。 + * - 如果 checked 为 false,则只保留已选中的 disabled 选项。 + */ const onCheckAllChange = (checked: boolean) => { if (!props.multiple) return; - const value = checked ? optionalList.value.map((option) => option.value) : []; - setInnerValue(value, { selectedOptions: getSelectedOptions(value), trigger: checked ? 'check' : 'clear' }); + const lockedValues = innerValue.value.filter((value: string | number | boolean) => { + return optionsList.value.find((item) => item.value === value && item.disabled); + }); + const activeValues = optionalList.value.map((option) => option.value); + const values = checked ? [...new Set([...activeValues, ...lockedValues])] : [...lockedValues]; + setInnerValue(values, { selectedOptions: getSelectedOptions(values), trigger: checked ? 'check' : 'clear' }); }; // 已选的长度