vue 实现列表多选
Vue 实现列表多选的方法
使用 v-model 绑定数组
通过 v-model 绑定一个数组,可以自动处理多选逻辑。适用于复选框(checkbox)场景。
<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>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, label: '选项1', value: 'value1' },
{ id: 2, label: '选项2', value: 'value2' },
{ id: 3, label: '选项3', value: 'value3' },
],
selectedItems: []
};
}
};
</script>
自定义多选逻辑
如果需要更复杂的交互(如点击行选中),可以通过手动管理选中状态实现。
<template>
<div>
<div
v-for="item in items"
:key="item.id"
@click="toggleSelect(item)"
:class="{ 'selected': selectedItems.includes(item.id) }"
>
{{ item.label }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, label: '选项1' },
{ id: 2, label: '选项2' },
{ id: 3, label: '选项3' },
],
selectedItems: []
};
},
methods: {
toggleSelect(item) {
const index = this.selectedItems.indexOf(item.id);
if (index === -1) {
this.selectedItems.push(item.id);
} else {
this.selectedItems.splice(index, 1);
}
}
}
};
</script>
<style>
.selected {
background-color: #f0f0f0;
}
</style>
使用第三方组件库
若项目中使用 UI 库(如 Element UI、Ant Design Vue),可直接调用其多选组件。
以 Element UI 为例:
<template>
<el-checkbox-group v-model="selectedItems">
<el-checkbox
v-for="item in items"
:key="item.id"
:label="item.value"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, label: '选项1', value: 'value1' },
{ id: 2, label: '选项2', value: 'value2' },
{ id: 3, label: '选项3', value: 'value3' },
],
selectedItems: []
};
}
};
</script>
键盘交互增强
通过监听键盘事件(如 Shift 多选),提升用户体验。
<template>
<div>
<div
v-for="(item, index) in items"
:key="item.id"
@click="handleClick(index, $event)"
:class="{ 'selected': selectedItems.includes(item.id) }"
>
{{ item.label }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, label: '选项1' },
{ id: 2, label: '选项2' },
{ id: 3, label: '选项3' },
],
selectedItems: [],
lastSelectedIndex: null
};
},
methods: {
handleClick(index, event) {
if (event.shiftKey && this.lastSelectedIndex !== null) {
const start = Math.min(index, this.lastSelectedIndex);
const end = Math.max(index, this.lastSelectedIndex);
this.selectedItems = this.items
.slice(start, end + 1)
.map(item => item.id);
} else {
this.toggleSelect(this.items[index]);
this.lastSelectedIndex = index;
}
},
toggleSelect(item) {
const index = this.selectedItems.indexOf(item.id);
if (index === -1) {
this.selectedItems.push(item.id);
} else {
this.selectedItems.splice(index, 1);
}
}
}
};
</script>






