基于element-ui实现的多级树形带复选框的表格
项目开发过程中,碰到一个需求,后端返回表格数据,但是子节点的个数不确定,最多为5个节点,并且每一列带有复选框以用于单个和批量设置。
项目所使用的技术为,在此基础上,为每一行加上。 以下,为本次所实现的核心代码。 第一步,表格设置和复选框监听
// el-table设置row-key="id"(必须唯一性)
和:tree-props="{children: childlist, hasChildren: hasChillist}"
根据后端返回的字段进行设置和是否使用懒加载
<el-table-column>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.checked" :change="checkChange(scope)">
</el-checkbox>
</template>
</el-table-column>
第二步,监听函数
checkChange(scope){
if(scope.row.hasChild){
this.handleCheckAll(scope.row,scope.row.checked)
}
this.getParent(this.problemList.childlist,scope.row.Id, scope.row.checked)
}
第三步,复选框逻辑函数,思路如下,当点击的复选框含有子节点haschild时,执行handleCheckAll函数,并且递归执行,那么全选或者全不选时逻辑就完成了;当选中所有子节点时,父节点也被选中,和取消一个被全选的子节点,父节点也取消选中时逻辑如下,需要后端返回子节点ID,查找父节点所存在的子节点长度和选中个数,如果选中个数等于其子节点长度则父节点被选中,反之,父节点被取消选中。
handleCheckAll(row,checked){
row.checked = checked;
if(row.hasChild){
let that = this
row.childlist.forEach( (element,i) => {
that.handleCheckAll(row.childlist[i],checked);
})
}
}
getParent(data2, nodeId2, isChecked){
var arrRes = [];
if (data2.length == 0) {
if (!!nodeId2) {
arrRes.push(data2)
}
return arrRes;
}
let rev = (data, nodeId) => {
for (var i = 0, length = data.length; i < length; i++) {
let node = data[i];
if (node.Id == nodeId) {
arrRes.push(node)
rev(data2, node.parentId);
break;
}
else {
if (!!node.childlist) {
rev(node.childlist, nodeId);
}
}
}
return arrRes;
};
arrRes = rev(data2, nodeId2);
arrRes.forEach((item,i)=>{
if (!item.hasChild) {
item.checked = isChecked;
} else {
var num = 0;
item.childlist.forEach((item,i) => {
if (item.checked == true) {
num+=1;
}
})
if (num == item.childlist.length) {
item.checked = true;
} else {
item.checked = false;
}
}
});
}
实现效果如下
最后,后续代码会再次优化,有简便的思路也可以提供给我,一起加油!!!? ? ?
上一篇:
IDEA上Java项目控制台中文乱码
