You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue自定义多选框组件异常:无法收集选中项为数组仅保留最后值

Vue自定义多选框组件无法维护选中项数组的问题解决

你的问题出在自定义多选框组件的事件处理逻辑上——每次勾选时你直接把单个选项值emit给父组件,导致父组件的数组状态被替换成了单个字符串,而不是维护一个包含所有选中项的数组。

修改后的自定义多选框组件代码:

<script setup>
const props = defineProps({
  modelValue: {
    type: Array,
    default: () => []
  },
  options: {
    type: Array,
    required: true
  }
})

const emit = defineEmits(['update:modelValue'])

const handleCheckboxChange = (option) => {
  // 基于当前选中状态创建新数组,保证响应式
  let newValue = [...props.modelValue]
  if (newValue.includes(option)) {
    // 如果已选中,移除该项
    newValue = newValue.filter(item => item !== option)
  } else {
    // 如果未选中,添加该项
    newValue.push(option)
  }
  emit('update:modelValue', newValue)
}
</script>

<template>
  <div v-for="option in options" :key="option">
    <input
      type="checkbox"
      :id="option"
      :value="option"
      :checked="modelValue.includes(option)"
      @change="handleCheckboxChange(option)"
    >
    <label :for="option">{{ option }}</label>
  </div>
</template>

关键修改点说明:

  • 绑定checked属性:通过modelValue.includes(option)判断当前选项是否被选中,确保视图和状态同步,解决勾选后不显示选中样式的问题。
  • 重构事件处理逻辑:不再直接emit单个值,而是基于当前的modelValue数组,判断选项是否已存在,执行添加或移除操作,最终emit更新后的数组。
  • 使用新数组保证响应式:用扩展运算符[...props.modelValue]创建原数组的副本,避免直接修改props(Vue中props是只读的),同时确保数组的响应式更新。

父组件的代码无需修改,保持原样即可。修改后,勾选多个选项时,user.contactPreference会正确维护所有选中项的数组,不会再被单个值覆盖。

内容的提问来源于stack exchange,提问作者Onyx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:40:12