当前位置:首页 > VUE

vue实现multiselect效果

2026-01-19 04:52:21VUE

Vue 实现多选(Multiselect)效果

使用第三方库 vue-multiselect

安装 vue-multiselect 库:

npm install vue-multiselect

在 Vue 组件中引入并使用:

<template>
  <div>
    <multiselect
      v-model="selected"
      :options="options"
      :multiple="true"
      :close-on-select="false"
      placeholder="选择多个选项"
      label="name"
      track-by="name"
    ></multiselect>
  </div>
</template>

<script>
import Multiselect from 'vue-multiselect'

export default {
  components: { Multiselect },
  data() {
    return {
      selected: [],
      options: [
        { name: '选项1' },
        { name: '选项2' },
        { name: '选项3' }
      ]
    }
  }
}
</script>

<style src="vue-multiselect/dist/vue-multiselect.css"></style>

自定义实现多选功能

如果不希望使用第三方库,可以通过原生 Vue 实现多选功能:

<template>
  <div>
    <div class="multiselect">
      <div class="selected-options">
        <span v-for="(option, index) in selected" :key="index" class="selected-tag">
          {{ option }}
          <button @click="removeOption(index)">×</button>
        </span>
      </div>
      <input
        type="text"
        v-model="searchQuery"
        @keydown.enter="addOption"
        placeholder="输入并回车添加选项"
      />
      <ul v-if="filteredOptions.length > 0" class="options-list">
        <li
          v-for="(option, index) in filteredOptions"
          :key="index"
          @click="selectOption(option)"
        >
          {{ option }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selected: [],
      options: ['选项1', '选项2', '选项3', '选项4'],
      searchQuery: ''
    }
  },
  computed: {
    filteredOptions() {
      return this.options.filter(
        option =>
          option.toLowerCase().includes(this.searchQuery.toLowerCase()) &&
          !this.selected.includes(option)
      )
    }
  },
  methods: {
    addOption() {
      if (
        this.searchQuery.trim() &&
        !this.selected.includes(this.searchQuery.trim()) &&
        this.options.includes(this.searchQuery.trim())
      ) {
        this.selected.push(this.searchQuery.trim())
        this.searchQuery = ''
      }
    },
    selectOption(option) {
      if (!this.selected.includes(option)) {
        this.selected.push(option)
        this.searchQuery = ''
      }
    },
    removeOption(index) {
      this.selected.splice(index, 1)
    }
  }
}
</script>

<style>
.multiselect {
  border: 1px solid #ccc;
  padding: 5px;
  border-radius: 4px;
}
.selected-options {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
  margin-bottom: 5px;
}
.selected-tag {
  background: #eee;
  padding: 2px 5px;
  border-radius: 3px;
  display: flex;
  align-items: center;
}
.options-list {
  list-style: none;
  padding: 0;
  margin: 5px 0 0 0;
  border: 1px solid #eee;
  max-height: 150px;
  overflow-y: auto;
}
.options-list li {
  padding: 5px 10px;
  cursor: pointer;
}
.options-list li:hover {
  background: #f5f5f5;
}
</style>

使用 Element UI 的多选组件

如果项目中使用 Element UI,可以直接使用其多选组件:

vue实现multiselect效果

<template>
  <div>
    <el-select v-model="selected" multiple placeholder="请选择">
      <el-option
        v-for="item in options"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      ></el-option>
    </el-select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selected: [],
      options: [
        { value: 'option1', label: '选项1' },
        { value: 'option2', label: '选项2' },
        { value: 'option3', label: '选项3' }
      ]
    }
  }
}
</script>

注意事项

  • 使用第三方库时注意版本兼容性
  • 自定义实现时需考虑键盘交互和可访问性
  • 大数据量情况下需要实现虚拟滚动优化性能
  • 移动端需确保触摸操作体验良好

标签: 效果vue
分享给朋友:

相关文章

vue实现用户信息表

vue实现用户信息表

Vue 实现用户信息表的方法 使用 Vue CLI 创建项目 安装 Vue CLI 并初始化项目: npm install -g @vue/cli vue create user-info-tabl…

vue实现mvc

vue实现mvc

Vue 实现 MVC 模式 Vue 本身是一个 MVVM(Model-View-ViewModel)框架,但可以通过结构调整实现 MVC(Model-View-Controller)模式。以下是具体实…

实现.vue文件

实现.vue文件

创建.vue文件的基本结构 一个标准的.vue文件包含三个部分:模板(template)、脚本(script)和样式(style)。这种结构允许开发者在一个文件中管理组件的HTML、JavaScrip…

vue实现切换

vue实现切换

Vue 实现切换功能的方法 在 Vue 中实现切换功能可以通过多种方式实现,以下是一些常见的方法: 使用 v-if 和 v-else 指令 通过条件渲染实现切换功能,适用于简单的显示/隐藏场景。…

vue实现抽奖

vue实现抽奖

Vue 实现抽奖功能 基本抽奖逻辑 创建一个Vue组件,包含奖品列表、抽奖按钮和结果显示区域。使用随机数生成器选择奖品。 <template> <div> <…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…