vue全选按钮怎么实现
Vue 全选按钮实现方法
基础实现(基于 v-model 和计算属性)
在 Vue 中实现全选功能通常需要结合 v-model 和计算属性。以下是一个基础示例:

<template>
<div>
<input type="checkbox" v-model="selectAll" @change="toggleSelectAll"> 全选
<div v-for="item in items" :key="item.id">
<input type="checkbox" v-model="selectedItems" :value="item.id">
{{ item.name }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, name: '选项1' },
{ id: 2, name: '选项2' },
{ id: 3, name: '选项3' }
],
selectedItems: []
}
},
computed: {
selectAll: {
get() {
return this.selectedItems.length === this.items.length
},
set(value) {
this.selectedItems = value ? this.items.map(item => item.id) : []
}
}
},
methods: {
toggleSelectAll() {
this.selectAll = !this.selectAll
}
}
}
</script>
使用 watch 实现
另一种实现方式是使用 watch 监听选择变化:

<template>
<div>
<input type="checkbox" v-model="allSelected"> 全选
<div v-for="item in items" :key="item.id">
<input type="checkbox" v-model="item.selected">
{{ item.name }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, name: '选项1', selected: false },
{ id: 2, name: '选项2', selected: false },
{ id: 3, name: '选项3', selected: false }
],
allSelected: false
}
},
watch: {
items: {
handler(newVal) {
this.allSelected = newVal.every(item => item.selected)
},
deep: true
},
allSelected(newVal) {
this.items.forEach(item => {
item.selected = newVal
})
}
}
}
</script>
表格中的全选实现
在表格场景中,全选功能的实现类似:
<template>
<table>
<thead>
<tr>
<th><input type="checkbox" v-model="selectAll"></th>
<th>名称</th>
</tr>
</thead>
<tbody>
<tr v-for="item in items" :key="item.id">
<td><input type="checkbox" v-model="selectedItems" :value="item.id"></td>
<td>{{ item.name }}</td>
</tr>
</tbody>
</table>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, name: '项目1' },
{ id: 2, name: '项目2' }
],
selectedItems: []
}
},
computed: {
selectAll: {
get() {
return this.selectedItems.length === this.items.length
},
set(value) {
this.selectedItems = value ? this.items.map(item => item.id) : []
}
}
}
}
</script>
使用 Vuex 管理状态
在大型应用中,可以使用 Vuex 管理选择状态:
// store.js
export default new Vuex.Store({
state: {
items: [
{ id: 1, name: '选项1' },
{ id: 2, name: '选项2' }
],
selectedItems: []
},
mutations: {
toggleSelectAll(state, payload) {
state.selectedItems = payload ? state.items.map(item => item.id) : []
},
toggleItemSelection(state, id) {
const index = state.selectedItems.indexOf(id)
if (index === -1) {
state.selectedItems.push(id)
} else {
state.selectedItems.splice(index, 1)
}
}
},
getters: {
isAllSelected: state => {
return state.selectedItems.length === state.items.length
}
}
})
<template>
<div>
<input
type="checkbox"
:checked="$store.getters.isAllSelected"
@change="$store.commit('toggleSelectAll', !$store.getters.isAllSelected)"
> 全选
<div v-for="item in $store.state.items" :key="item.id">
<input
type="checkbox"
:checked="$store.state.selectedItems.includes(item.id)"
@change="$store.commit('toggleItemSelection', item.id)"
>
{{ item.name }}
</div>
</div>
</template>
以上方法可以根据具体需求选择使用,基础实现适合简单场景,Vuex 方案适合状态管理复杂的大型应用。






