End.
原
elementUI点击多选框数据改变,视图不改变问题,多选indeterminate状态变更错误
使用elementUI的时候,使用多选组全选的时候,渲染数据会发生,全选状态没有变更。
indeterminate 状态变更错误。
翻看了element-ui官方文档,但是也没有找到。最终在vue相关知识点发现,是由于传过来的数据是数组,数组中数据发生变化,vue是侦听不到的,但是重写的这几个数组的方法(比如splice()、pop、push等)修改的数组是可以侦听到的,这几个方法都有被vue重写。
所以此时需要执行强制更新vue视图。
indeterminate 状态
indeterminate
属性用以表示 checkbox 的不确定状态,一般用于实现全选的效果。
效果图:
部分代码
<el-form ref="dataForm" :rules="rules" :model="temp" label-position="right" label-width="60px"> <el-form-item label="名称" prop="name"> <el-input v-model="temp.name" maxlength="32" show-word-limit /> </el-form-item> <el-form-item label="编码" prop="code"> <el-input v-model="temp.code" maxlength="8" show-word-limit /> </el-form-item> <el-form-item label="权限" prop="role"> <div v-for="(item, index) in powerTreeList" :key="index" style="margin-bottom: 12px"> <el-checkbox v-model="checkAll[index]" :indeterminate="isIndeterminate[index]" @change="handleCheckAllChange(checkAll[index], index)"><b>{{ item.name }}</b></el-checkbox> <el-checkbox-group v-model="checkedMenu[index]" @change="handleCheckedCitiesChange(checkedMenu[index], index)"> <el-checkbox v-for="ci in item.children" :key="ci.id" :label="ci.id">{{ ci.name }}</el-checkbox> </el-checkbox-group> </div> </el-form-item> </el-form>
# 省略代码
data() {
return {
# 省略代码
powerTreeList: [], checkAll: [], // 是否全选了 isIndeterminate: [], // 是否全选状态 checkedMenu: [] // 选中了的权限数据
}
}
methods: { handleCheckAllChange(val, index) { this.isIndeterminate[index] = false this.checkedMenu[index] = [] if (val) { for (const i in this.powerTreeList[index].children) { this.checkedMenu[index].push(this.powerTreeList[index].children[i].id) } } }, handleCheckedCitiesChange(value, index) { const checkedCount = value.length this.checkAll[index] = checkedCount === this.powerTreeList[index].children.length this.isIndeterminate[index] = checkedCount > 0 && checkedCount < this.powerTreeList[index].children.length // this.checkAll.splice() // 更新视图 // this.isIndeterminate.splice() // 更新视图 this.$forceUpdate() // 强制更新 },
# 省略代码
这三个为核心强制更新视图的代码。
// this.checkAll.splice() // 更新视图
// this.isIndeterminate.splice() // 更新视图
this.$forceUpdate() // 强制更新
End.