element-ui表格有多个复选框的列,表单和表头的复选框怎么进行操作?

问题描述

clipboard.png
1、点击查看左边的复选框,全选这一列;其余的同理。
2、表头功能动态添加(根据后台的数据,动态添加表头,比如后台还有个导入功能,这个表单的表头也必须动态增加一列)

问题出现的环境背景及自己尝试过哪些方法

我使用的模板是element-ui提供的,表头是自定义表头,由于要动态的增加表头,所以我使用了循环遍历,这就导致了这三列的数据是冲突的:比如说点击查看,应该全选这一列,但是现在所有的复选框全部勾选了。
为了解决这个问题,我又使用二维数组来分别存储这些数据,让它们不冲突,但是现在点击表头的复选框,表格的复选框没反应了

相关代码

<el-table-column
      prop="name"
      label="模块名称">
    </el-table-column>
    <template v-for='(col) in fdata'>
      <el-table-column
        align="center"
        width="150">
        <template slot-scope="scope" slot="header">
          <el-checkbox :indeterminate="isIndeterminate[col.id-1]" v-model="selectall[col.id-1]"
                       @change="( (val) => handleCheckAllChange(val,col.id-1))">
            {{col.name}}
          </el-checkbox>
        </template>
        <template slot-scope="scope">
          <el-checkbox-group v-model="checkedCities[[col.id-1]]" @change="((value) => handleCheckedCitiesChange(value,col.id-1))">
            <el-checkbox :label="scope.row.id" :key="scope.row.id"><span>{{scope.row.id}}</span></el-checkbox>
          </el-checkbox-group>
        </template>
      </el-table-column>
      
      
 export default {
    data () {
        return {
          tableData: [],
          form: {},
          row: '',
          fdata: [],
          selectall: [],
          isIndeterminate: [],
          checkedCities: [[]],
          multipleSelection: [[]],
          id: [[]]
        }
      },
      methods: {
        handleCheckAllChange (val, index) {
          console.log(val + '' + index)
          this.selectall[index] = true
          this.checkedCities[[index]] = val ? this.id[[index]] : []
          this.isIndeterminate[index] = false
        },
        handleCheckedCitiesChange (value, index) {
          console.log(value)
          console.log(index)
          let checkedCount = value.length
          this.selectall[index] = checkedCount === this.id[[index]].length
          this.isIndeterminate[index] = true
        },
        loop (item, index) {
          if (item.children.length > 0) {
            this.id[[index]].push(item.id)
            for (let i in item.children) {
              this.loop(item.children[i], index)
            }
          } else if (item.children.length === 0) {
            this.id[[index]].push(item.id)
          }
        }},created () {
                let res = {
                  'data': {
                    'list': [
                      {
                        id: 1,
                        name: '订单',
                        children: [{
                          id: 2,
                          name: '订单发起',
                          children: [{
                            id: 3,
                            name: '订单处理',
                            children: []
                          }]
                        }]
                      }, {
                        id: 4,
                        name: '资金',
                        children: [{
                          id: 5,
                          name: '资金管理',
                          children: [{
                            id: 6,
                            name: '资金汇入汇出',
                            children: []
                          }]
                        }, {
                          id: 7,
                          name: '资金结算',
                          children: [{
                            id: 8,
                            name: '资金转结',
                            children: []
                          }]
                        }]
                      }, {
                        id: 9,
                        name: '商品',
                        children: [{
                          id: 10,
                          name: '日用品',
                          children: [{
                            id: 11,
                            name: '牙刷',
                            children: []
                          }]
                        }, {
                          id: 12,
                          name: '数码用品',
                          children: [{
                            id: 13,
                            name: '电脑',
                            children: []
                          }]
                        }]
                      }
                    ],
                    'functionData': [
                      {id: 1, name: '查看'}, {id: 2, name: '编辑'}, {id: 3, name: '审批'}
                    ]
                  }
                }
                // 初始化表单和表格数据
                this.form = this.$route.params.row
                this.tableData = res.data.list
                // 初始化复选框表头数据
                this.fdata = res.data.functionData
                // 初始化复选框其他参数
                for (let i = 0; i < this.fdata.length; i++) {
                  this.selectall[i] = false
                  this.isIndeterminate[i] = false
                  this.checkedCities[[i]] = []
                }
                // 将tree型菜单数据的id存入id数组
                for (let i = 0; i < this.fdata.length; i++) {
                  this.id[[i]] = []
                  for (let j = 0; j < this.tableData.length; j++) {
                    if (this.tableData[j].children.length > 0) {
                      this.loop(this.tableData[j], i) // 递归方法
                    } else {
                      this.id[[i]].push(this.tableData[j].id)
                    }
                  }
                  this.multipleSelection[[i]] = this.id[[i]]
                }
              }
            }

你期待的结果是什么?实际看到的错误信息又是什么?

各位有什么好的解决方案吗

阅读 9k
2 个回答
✓ 已被采纳新手上路,请多包涵

终于解决了。
一个最大的问题就是script里面已经将每个数组的值都添加了,但是el标签就是监测不到变化,查看Vue的文档后发现,v-model不支持数组动态修改,说白了就是你如果直接使用数组如a[i],那么vue的v-model是不会更新数组的数据的,必须得使用$set方法,才能将这些变化重新加入到vue的监测范围内,具体请查看https://cn.vuejs.org/v2/guide...

<script>
handleCheckAllChange (val, index) {
if (val) {
    this.$set(this.checks, index, this.id)
  } else {
    this.$set(this.checks, index, [])
  }
  this.$set(this.isIndeterminate, index, false)
},
handleCheckedCitiesChange (value, index) {
  let checkedCount = value.length
  this.$set(this.selectAll, index, checkedCount === this.id.length)
  this.$set(this.isIndeterminate, index, checkedCount > 0 && checkedCount < this.id.length)
}
</script>
`
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏