当前位置:首页 > 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,可以直接使用其多选组件:

<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实现multiselect效果

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

相关文章

vue实现选区创建

vue实现选区创建

Vue 实现选区创建的方法 在 Vue 中实现选区创建通常涉及 DOM 操作和事件处理。以下是几种常见的方法: 使用原生 DOM API 通过 window.getSelection() 和 Ra…

vue实现添加用户

vue实现添加用户

Vue 实现添加用户功能 数据绑定与表单设计 在 Vue 中实现添加用户功能,首先需要设计一个表单,用于收集用户输入的数据。通过 v-model 实现双向数据绑定,确保表单数据与 Vue 实例中的数据…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-i…

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用X…

vue实现下拉框删除

vue实现下拉框删除

Vue 实现下拉框删除功能 在Vue中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

vue请求实现进度条

vue请求实现进度条

实现请求进度条的方法 在Vue中实现请求进度条可以通过多种方式完成,常见的有使用第三方库如axios结合nprogress或自定义进度条组件。以下是几种实现方法: 使用axios和nprogress…