2行JS代码实现Vue全选和反选
实现效果:
第一行:子选项的选中状态 等于 全选框的状态
this.letters.forEach(item => item.check = this.checkAll)
第二行: 使用数组 every
方法的特性,数组的每一项均满足某一条件时,结果为 true
也可以使用数组的
filter
方法,判断返回子选项为 true的列表的长度,等同于数据源的长度时,可认定为全选状态,否则非全选
this.checkAll = this.letters.filter(item => item.check).length == this.letters.length
this.checkAll = this.letters.every(item => item.check)
完整 demo 参考:
<template>
<div>
<table border="1">
<thead>
<tr>
<th><input type="checkbox" v-model="checkAll" @change="checkAllChange"> </th>
<th>字母</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr v-for="item in letters" :key="item.id">
<td><input type="checkbox" v-model="item.check" @change="checkChange"></td>
<td>{{item.letter}}</td>
<td><button>删除</button></td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
export default {
data() {
return {
checkAll: false,
letters: [
{ letter: 'A', id: 'A', check: false },
{ letter: 'B', id: 'B', check: false },
{ letter: 'C', id: 'C', check: false },
{ letter: 'D', id: 'D', check: false },
{ letter: 'E', id: 'E', check: false },
{ letter: 'F', id: 'F', check: false }
]
}
},
methods: {
checkAllChange() {
this.letters.forEach(item => item.check = this.checkAll)
},
checkChange() {
// this.checkAll = this.letters.filter(item => item.check).length == this.letters.length // 1. 使用 filter方法
this.checkAll = this.letters.every(item => item.check) // 2. 使用 every 方法
}
}
}
</script>
<style scoped>
table {
border: 1px solid #ccc;
width: 500px;
text-align: center;
line-height: 37px;
border-collapse: collapse;
}
button {
border-radius: 5px;
border: 1px solid #ccc;
padding: 2px 10px;
}
</style>