一.html结构
<el-checkbox class="allCheck" :indeterminate="item.isIndeterminate" v-model="item.isCheckAll" @change="handleCheckAllChange(item.isCheckAll,i)">全选</el-checkbox>
<el-checkbox-group v-model="item.value" @change="handleCheckedChange(item.value,i)">
<el-checkbox v-for="(tips,i) in item.tips" :label="tips.label" :key="i">{{tips.name}}</el-checkbox>
</el-checkbox-group>
1.全选按钮样式,对于indeterminate和v-model绑定的值相结合样式效果如下
indeterminate属性值 | v-model绑定值 | 结果 |
---|---|---|
true | false | - |
true | true | - |
false | true | 勾√ |
false | false | 空 |
2.@change绑定的事件如果不写传值会默认返回v-model绑定的值,但由于我的多选框数据是嵌套在对象里面的,因此需要多传一个索引值i,因此需要将v-model和i的值传入。
二.js部分
1.相关的数据层次结构
checkboxs: {
oneTips: {
tipName: 'xxxx',
value: [],
isCheckAll: false,
// 设置 indeterminate 状态,只负责样式控制
isIndeterminate: true,
tips: [{
name: '第一个checkbox',
label: 'one'
}, {
name: '第二个checkbox',
label: 'two'
}]
},
twoTips:{}
}
2.methods
// 多选框全选框
handleCheckAllChange (isCheckAll, i) {
var allTipsArr = this.getTipsLabel(this.checkboxs[i].tips)
this.checkboxs[i].value = isCheckAll ? allTipsArr : []
this.checkboxs[i].isIndeterminate = false
},
// 多选框变化
handleCheckedChange (val, i) {
const checkedCount = val.length
var allTipsArr = this.getTipsLabel(this.checkboxs[i].tips)
this.checkboxs[i].isCheckAll = checkedCount === allTipsArr.length
this.checkboxs[i].isIndeterminate = checkedCount > 0 && checkedCount < allTipsArr.length
},
// 提取tips的全部label
getTipsLabel (tipsArr) {
var newArr = []
for (const item of tipsArr) {
newArr.push(item.label)
}
return newArr
}