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.