vue3+antdesign 完成嵌套表格的复选框联动

computed: {
        rowSelectionFather() {
            return {
                // onChange: (selectedRowKeys, selectedRows) => {
                //    this.selectedRowKeysFather = selectedRowKeys
                // },
                selectedRowKeys:this.selectedRowKeysFather,
                onSelect: (record, selected, selectedRows) => {
                    const setChildArr = this.dataFather.find(d => d.id === record.id).studentList.map(item => item.id)
                    // 第一步 判断selected true:选中,false,取消选中
                    if (selected) {
                    // 第二步,父Table选中,子Table全选中(全部整合到一起,然后去重)
                    this.selectedRowKeysFather.push(record.id)
                    this.selectedRowKeysChild = Array.from(new Set([...setChildArr, ...this.selectedRowKeysChild]))
                    } else {
                    // 第二步,父Table取消选中,子Table全取消选中(针对childSelectedRowKeys,过滤掉取消选中的父Table下的所有子Table的key)
                     this.selectedRowKeysFather.splice( this.selectedRowKeysFather.findIndex(item => item === record.id), 1)
                    this.selectedRowKeysChild = this.selectedRowKeysChild.filter(item => !setChildArr.some(e => e === item))
                    }
                    // 第三步, 判断所有子选项长度  是否为全选
                    this.checkAllSelected()

                },
                onSelectAll: (selected, selectedRows, changeRows) => {
                     // 将改变的父Table下的子Table下的key都添加到setChildArr中
                    let setChildArr = []
                    console.log('change',changeRows)
                    changeRows.forEach(e => {
                    setChildArr = [...setChildArr, ...e.studentList.map(item => item.id)]
                    })
                    // 第一步判断selected true:全选,false:取消全选
                    if (selected) {
                    // 第二步:父Table选中,子Table全选中,设置子Table的SelectedRowKeys
                    this.selectedRowKeysFather = Array.from(new Set([...this.selectedRowKeysFather, ...changeRows.map(item => item.id)]))
                    this.selectedRowKeysChild = Array.from(new Set([...this.selectedRowKeysChild, ...setChildArr]))
                    } else {
                    // 第二步:父Table取消选中,子Table全取消选中,设置子Table的SelectedRowKeys
                    this.selectedRowKeysFather = []
                    this.selectedRowKeysChild = []
                    }

                }
            };
        },
        rowSelectionChild() {
            return {
                hideSelectAll: true,
                selectedRowKeys:this.selectedRowKeysChild,
                onSelect: (record, selected, selectedRows) => {
                    //  record:选择的行数据 selected:当前行是否选择 true/false selectedRows:选择的行 如果选择分组的行上个数据会变成[undefined, undefined, {…}]
                    // 1.设置子Table手动选择/取消某行的回调 onSelect
                    // 1.1 判断selected true:选中,将key值添加到childSelectedRowKeys,false:取消选中,将key值从childSelectedRowKeys中移除
                    if (selected) {
                    this.selectedRowKeysChild.push(record.id)
                    } else {
                    this.selectedRowKeysChild.splice(this.selectedRowKeysChild.findIndex(item => item === record.id), 1)
                    }
                    // 1.1.1 必须去除undefined,否则selectedRows会将其他子Table中选中的key值放到数组中,但是值为undefined,如:[ undefined,1,uundefined]
                    selectedRows = selectedRows.filter(item => item !== undefined)

                    // 1.2 判断selectedRows的长度是否为data中child的长度,相等,就将父table选中,不等就不选中
                    for (const [index, item] of this.dataFather.entries()) {
                        // 1.2.1 如果当前选择的在一个分组中   find返回对象  没有undefined
                        if (item.studentList.find(d => d.id === record.id)) {
                            // 1.2.2 判断长度相等  将父级的key加入
                            if (item.studentList.length === selectedRows.length) {
                                this.selectedRowKeysFather.push(item.id)
                            } else {
                                // 1.2.3 不相等 将父级的key进行删除
                                if (this.selectedRowKeysFather.some(d => d === item.id)) {
                                    this.selectedRowKeysFather.splice(this.selectedRowKeysFather.findIndex(item1 => item1 === item.id), 1)
                                }
                                // 1.2.4 先找出data.child的数据的key集合
                                const setChildArr = item.studentList.map(item => item.id)
                                // 1.2.5 更新父级行的选择状态  判断选择的行中是否存在key在setChildArr中
                                setTimeout(() => {
                                    if (setChildArr.some(k => selectedRows.some(j => k === j.id))) {
                                    this.checkboxDomList[index + 1].setAttribute('class', 'ant-checkbox-indeterminate')
                                    } else {
                                    this.checkboxDomList[index + 1].removeAttribute('class', 'ant-checkbox-indeterminate')
                                    }
                                }, 0)
                                this.checkAllSelected()
                                break
                            }
                        }
                    }

                }
            }
        }
    },
 initData() {
            // 获取列表的数据
            this.dataFather = [{id:1,awardName:'asd',awardType:'自定义',studentList:[{id:11,className:'aa'}]},{id:2,awardName:'asd2',awardType:'自定义',studentList:[{id:12,className:'aa2'},{id:13,className:'aa3'}]}]
//这里使用异步 为了拿到数据后再取拿dom节点 这样能拿全  不然只能拿到一个
            setTimeout(() => {
                 const el =   document.querySelector('#tableId')
                console.log(el)
                this.checkboxDomList =  [...el.querySelectorAll('label.ant-checkbox-wrapper span:not(.ant-checkbox-inner)')]
                console.log(this.checkboxDomList)
                // this.checkboxDomList[0].setAttribute('class', 'ant-checkbox-indeterminate')
            },0)
           
        },
 checkAllSelected() {
            const allChildKey = []
            this.dataFather.forEach(item => {
                allChildKey.push(...item.studentList.map(i => i.id))
            })
            setTimeout(() => {
                // 如果有长度 为中间态
                if (this.selectedRowKeysChild.length > 0) {
                    this.checkboxDomList[0].setAttribute('class', 'ant-checkbox-indeterminate')
                // 全部相等
                if (allChildKey.length === this.selectedRowKeysChild.length) {
                    this.checkboxDomList[0].setAttribute('class', 'ant-checkbox-checked')
                } else {
                    this.checkboxDomList[0].removeAttribute('class', 'ant-checkbox-checked')
                    this.checkboxDomList[0].setAttribute('class', 'ant-checkbox-indeterminate')
                }
                } else {
                    this.checkboxDomList[0].removeAttribute('class', 'ant-checkbox-indeterminate')
                }
            }, 0)
        },
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值