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

Vue.js中避免Select2多选下拉框出现重复选项问题

解决Select2多选下拉框重复选项问题

问题根源

你的代码直接循环hosts.host_mapping生成<option>,但同一host_group会对应多个host_name,导致生成大量重复选项。Select2会将这些重复选项视为独立条目,选中时就会重复添加到绑定的数组中。

解决方案

1. 渲染唯一的选项列表

先对符合条件的host_group去重,避免生成重复<option>,通过Vue计算属性实现:

// 在组件的computed中添加
computed: {
  uniqueHostGroups() {
    // 过滤当前item包含的host对应的group,再去重
    const matchedGroups = this.hosts.host_mapping
      .filter(opt => this.item.hosts.includes(opt.host_name))
      .map(opt => opt.host_group);
    // 利用Set去重后转回数组
    return [...new Set(matchedGroups)];
  }
}

修改模板,循环去重后的列表:

<select style="width: 100%" multiple v-model="item.host_groups" v-select2 class="form-control select2" :id="'tmp_hostgroup_'+index">
  <option v-for="group in uniqueHostGroups" :value="group" :key="group">{{ group }}</option>
</select>

2. 确保选中值自动去重(可选)

为彻底避免重复值,监听绑定数组的变化,自动去重:

// 在组件的watch中添加
watch: {
  'item.host_groups'(newVal) {
    this.item.host_groups = [...new Set(newVal)];
  }
}

或者使用带get/set的计算属性替代直接绑定:

computed: {
  filteredHostGroups: {
    get() {
      return [...new Set(this.item.host_groups)];
    },
    set(val) {
      this.item.host_groups = [...new Set(val)];
    }
  }
}

模板中修改v-model:

v-model="filteredHostGroups"

3. 修复Vue的key绑定

原代码中v-for的key绑定option.host_group,当存在重复选项时key会重复,违反Vue渲染规则。使用去重后的列表后,group作为key天然唯一,解决了这个问题。

额外说明

你的Select2指令配置没有问题,重复选项的核心原因是重复的<option>标签,解决选项唯一性后即可彻底解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:15:34