当前位置:首页 > VUE

vue实现点选多选

2026-01-18 10:03:00VUE

Vue 实现点选多选功能

基础实现(基于数组存储选中项)

使用 v-model 绑定到数组实现多选,适用于复选框组场景:

<template>
  <div>
    <div v-for="item in items" :key="item.id">
      <input 
        type="checkbox" 
        :id="item.id" 
        :value="item.value" 
        v-model="selectedItems"
      >
      <label :for="item.id">{{ item.label }}</label>
    </div>
    <p>已选择:{{ selectedItems }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, value: 'apple', label: '苹果' },
        { id: 2, value: 'banana', label: '香蕉' },
        { id: 3, value: 'orange', label: '橙子' }
      ],
      selectedItems: []
    }
  }
}
</script>

对象存储方案(带状态管理)

当需要记录更复杂的选中状态时,可以使用对象存储:

<template>
  <div>
    <div 
      v-for="item in items" 
      :key="item.id"
      @click="toggleSelect(item.id)"
      :class="{ 'active': selectedItems[item.id] }"
    >
      {{ item.label }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 101, label: '选项A' },
        { id: 102, label: '选项B' },
        { id: 103, label: '选项C' }
      ],
      selectedItems: {}
    }
  },
  methods: {
    toggleSelect(id) {
      this.$set(this.selectedItems, id, !this.selectedItems[id])
    }
  }
}
</script>

<style>
.active {
  background-color: #42b983;
  color: white;
}
</style>

列表项组件化实现

封装可复用的多选列表组件:

<template>
  <selectable-list :items="dataList" v-model="selectedIds"/>
</template>

<script>
import SelectableList from './SelectableList.vue'

export default {
  components: { SelectableList },
  data() {
    return {
      dataList: [
        { id: 'x1', text: '项目1' },
        { id: 'x2', text: '项目2' }
      ],
      selectedIds: []
    }
  }
}
</script>

SelectableList.vue 组件实现:

<template>
  <ul>
    <li 
      v-for="item in items"
      :key="item.id"
      @click="handleClick(item.id)"
      :class="{ selected: isSelected(item.id) }"
    >
      {{ item.text }}
    </li>
  </ul>
</template>

<script>
export default {
  props: {
    items: Array,
    value: Array
  },
  methods: {
    handleClick(id) {
      const newSelection = [...this.value]
      const index = newSelection.indexOf(id)

      index === -1 
        ? newSelection.push(id)
        : newSelection.splice(index, 1)

      this.$emit('input', newSelection)
    },
    isSelected(id) {
      return this.value.includes(id)
    }
  }
}
</script>

高级功能扩展

实现全选/反选和批量操作:

<template>
  <div>
    <button @click="toggleAll">{{ allSelected ? '取消全选' : '全选' }}</button>
    <ul>
      <li 
        v-for="item in listData" 
        :key="item.id"
        @click="toggleItem(item.id)"
        :class="{ active: selected.has(item.id) }"
      >
        {{ item.name }}
      </li>
    </ul>
    <button @click="batchDelete" :disabled="selected.size === 0">
      删除选中项 ({{ selected.size }})
    </button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      listData: [
        { id: 1, name: '条目1' },
        { id: 2, name: '条目2' }
      ],
      selected: new Set()
    }
  },
  computed: {
    allSelected() {
      return this.selected.size === this.listData.length
    }
  },
  methods: {
    toggleItem(id) {
      this.selected.has(id)
        ? this.selected.delete(id)
        : this.selected.add(id)
    },
    toggleAll() {
      this.allSelected
        ? this.selected.clear()
        : this.listData.forEach(item => this.selected.add(item.id))
    },
    batchDelete() {
      this.listData = this.listData.filter(item => !this.selected.has(item.id))
      this.selected.clear()
    }
  }
}
</script>

性能优化建议

对于大型列表(超过 1000 项),建议采用虚拟滚动方案:

<template>
  <virtual-list 
    :size="50"
    :remain="20"
    :items="largeData"
    v-slot="{ item }"
  >
    <div 
      class="item"
      :class="{ selected: selectedMap[item.id] }"
      @click="selectItem(item.id)"
    >
      {{ item.content }}
    </div>
  </virtual-list>
</template>

<script>
import VirtualList from 'vue-virtual-scroll-list'

export default {
  components: { VirtualList },
  data() {
    return {
      largeData: generateLargeData(), // 假设有生成大数据的方法
      selectedMap: {}
    }
  },
  methods: {
    selectItem(id) {
      this.$set(this.selectedMap, id, !this.selectedMap[id])
    }
  }
}
</script>

关键实现要点

  • 数组方案适合简单场景,对象/Set 方案适合需要快速查找的场景
  • 使用 $set 确保响应式更新
  • 大型列表应考虑虚拟滚动技术
  • 组件化设计时通过 v-model 实现双向绑定
  • 使用计算属性优化全选状态的判断

vue实现点选多选

标签: 点选多选
分享给朋友:

相关文章

vue实现多选

vue实现多选

Vue 实现多选功能 在 Vue 中实现多选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定到一个数组,可以实现多选功能。适用于复选框组(…

vue 实现多选框

vue 实现多选框

Vue 实现多选框的方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选框的选择功能。每个复选框的 value 属性会被添加到数组中,取消勾选时则从数…

vue图片实现多选

vue图片实现多选

Vue图片多选实现方法 基础实现方案 使用v-model绑定数组配合input[type="checkbox"]实现多选功能。创建图片列表数据时,每个图片对象应包含唯一标识符: data() {…

elementui多选

elementui多选

ElementUI 多选组件使用指南 ElementUI 提供了 el-select 组件支持多选功能,通过设置 multiple 属性即可启用。以下是具体实现方法和常见场景示例: 基础多选实现…

vue实现多选答题

vue实现多选答题

实现多选答题功能 在Vue中实现多选答题功能,可以通过以下方法完成: 数据准备 定义一个questions数组,每个问题包含题目和选项,选项是一个对象数组,每个选项有文本和是否被选中的状态。…

vue 实现多选功能

vue 实现多选功能

Vue 实现多选功能的方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选功能。适用于复选框组(checkbox)或下拉多选(select multi…