当前位置:首页 > VUE

vue 实现多选功能

2026-03-28 23:39:24VUE

Vue 多选功能实现方法

基础实现(v-model 绑定数组)

通过 v-model 绑定数组实现多选,适用于原生 <select multiple> 或复选框组:

<template>
  <!-- 原生多选下拉框 -->
  <select v-model="selectedItems" multiple>
    <option v-for="item in options" :value="item.value">{{ item.label }}</option>
  </select>

  <!-- 复选框组 -->
  <div v-for="item in options" :key="item.value">
    <input 
      type="checkbox" 
      :id="item.value" 
      :value="item.value" 
      v-model="selectedItems"
    >
    <label :for="item.value">{{ item.label }}</label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedItems: [],
      options: [
        { value: 'opt1', label: 'Option 1' },
        { value: 'opt2', label: 'Option 2' }
      ]
    }
  }
}
</script>

自定义组件实现

封装可复用的多选组件,支持搜索、标签展示等功能:

<template>
  <div class="multi-select">
    <div class="selected-tags">
      <span v-for="(item, index) in selected" :key="index">
        {{ getLabel(item) }}
        <button @click="removeItem(index)">×</button>
      </span>
    </div>
    <input 
      type="text" 
      v-model="searchText" 
      @keydown.enter="addItem"
      placeholder="Type and press Enter"
    >
    <ul v-if="filteredOptions.length">
      <li 
        v-for="item in filteredOptions" 
        :key="item.value" 
        @click="toggleItem(item.value)"
      >
        {{ item.label }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  props: {
    options: Array,
    value: Array
  },
  data() {
    return {
      searchText: '',
      selected: this.value || []
    }
  },
  computed: {
    filteredOptions() {
      return this.options.filter(opt => 
        !this.selected.includes(opt.value) &&
        opt.label.toLowerCase().includes(this.searchText.toLowerCase())
      )
    }
  },
  methods: {
    toggleItem(value) {
      const index = this.selected.indexOf(value)
      if (index > -1) {
        this.selected.splice(index, 1)
      } else {
        this.selected.push(value)
      }
      this.$emit('input', [...this.selected])
    },
    getLabel(value) {
      const item = this.options.find(opt => opt.value === value)
      return item ? item.label : value
    },
    removeItem(index) {
      this.selected.splice(index, 1)
      this.$emit('input', [...this.selected])
    }
  }
}
</script>

第三方库方案

使用现成的多选组件库(如 vue-multiselect):

vue 实现多选功能

  1. 安装依赖:

    npm install vue-multiselect
  2. 基础用法:

    vue 实现多选功能

    
    <template>
    <multiselect
     v-model="selected"
     :options="options"
     :multiple="true"
     :close-on-select="false"
     label="label"
     track-by="value"
    ></multiselect>
    </template>
import Multiselect from 'vue-multiselect' export default { components: { Multiselect }, data() { return { selected: [], options: [ { label: 'Option 1', value: 'opt1' }, { label: 'Option 2', value: 'opt2' } ] } } } ```

高级功能扩展

实现全选/反选、分组显示等高级功能:

<template>
  <div>
    <button @click="toggleAll">Toggle All</button>
    <div v-for="group in groupedOptions" :key="group.name">
      <h4>{{ group.name }}</h4>
      <label v-for="item in group.items" :key="item.value">
        <input
          type="checkbox"
          :value="item.value"
          v-model="selectedItems"
        >
        {{ item.label }}
      </label>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedItems: [],
      groupedOptions: [
        {
          name: 'Group A',
          items: [
            { value: 'a1', label: 'Item A1' },
            { value: 'a2', label: 'Item A2' }
          ]
        },
        {
          name: 'Group B',
          items: [
            { value: 'b1', label: 'Item B1' },
            { value: 'b2', label: 'Item B2' }
          ]
        }
      ]
    }
  },
  methods: {
    toggleAll() {
      const allValues = this.groupedOptions.flatMap(g => g.items.map(i => i.value))
      this.selectedItems = this.selectedItems.length === allValues.length 
        ? [] 
        : [...allValues]
    }
  }
}
</script>

性能优化建议

对于大型数据集(1000+项),建议:

  • 添加虚拟滚动(使用 vue-virtual-scroller
  • 实现分页加载
  • 添加防抖搜索(使用 Lodash 的 debounce
  • 避免在模板中使用复杂计算

标签: 多选功能
分享给朋友:

相关文章

vue实现桌面功能

vue实现桌面功能

Vue 实现桌面功能的方法 Vue.js 可以通过结合 Electron 或 NW.js 等框架实现桌面应用开发。以下是几种常见的方法: 使用 Vue 与 Electron 结合 Electron…

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

vue 实现 功能

vue 实现 功能

Vue.js 是一个流行的前端框架,用于构建用户界面和单页应用程序。以下是一些常见的 Vue 功能实现方法: 数据绑定 Vue 的核心特性之一是数据绑定,可以通过 v-model 指令实现双向数据绑…

vue实现后台功能

vue实现后台功能

Vue 实现后台功能的方法 Vue.js 是一个流行的前端框架,适合构建后台管理系统。以下是实现后台功能的常见方法和步骤。 项目初始化 使用 Vue CLI 或 Vite 初始化项目: # Vue…

vue实现付费功能

vue实现付费功能

Vue 实现付费功能的方法 集成第三方支付平台 选择适合的第三方支付平台(如支付宝、微信支付、Stripe、PayPal等),并按照其文档进行集成。在 Vue 项目中,可以通过引入支付平台的 SDK…

vue 分页功能实现

vue 分页功能实现

分页功能实现方法 使用 Element UI 的分页组件 Element UI 提供了现成的分页组件 el-pagination,可以快速实现分页功能。 安装 Element UI: npm in…