如何优化复选框(el-checkbox)对于树形结构数据的应用 ?
问题描述
使用 element 复选框组件,但是公司的具体业务为树形复杂的数据结构时,改如何优雅的实现
- 全选反选
半选状态
问题出现的环境背景及自己尝试过哪些方法
个人发现 element 以及其他第三方组件库对于全选这种更适用于扁平化的数据结构
但是实际业务业务中碰到的数据结构为树,如何更优雅的处理该业务
楼主自己处理的时候思路主要是- watch 整个对象,每次 checkbox 进行勾选后重新计算一次 整体的全选半选逻辑
- 一级,二级节点全选反选 通过 @chang 去改变最底层的叶子节点的 checked ,然后再计算一遍整个对象的半选状态
注意,假设某个节点为 nodeA ,由于具体业务为权限,所以当 nodeA 的子节点都为选中状态时,nodeA 为选中状态,但是当取消勾选 nodeA 的某个子节点,nodeA 的 checked 属性应仍为 true(这是与扁平化全选反选不同的)
相关代码
粘贴代码文本(请勿用截图)
权限数据结构{
"modules": [
{
"name": "一级",
"code": "TASK_CTR",
"checked": true,
"groups": [
{
"name": "二级",
"code": "TASK_MGR",
"checked": true,
"permissions": [
{
"code": "TASK_LIST",
"description": "三级",
"checked": true
},
]
}
]
},
]
};
个人处理方法
<template>
<div class="permission-box">
<div
v-for="(item, ) in authList"
:key="item.code"
class="permission-box-project" >
<el-checkbox
v-model="item.checked"
:indeterminate="item.indeterminate"
@change="handleCheckAll($event,item.permissionVo.modules,'modules')"
>{{item.name}}</el-checkbox>
<div v-if="item.permissionVo && item.permissionVo.modules">
<div
v-for="(module, ) in item.permissionVo.modules"
:key="module.code"
class="permission-box-part">
<el-checkbox
v-model="module.checked"
:indeterminate="module.indeterminate"
@change="handleCheckAll($event,module.groups,'groups')"
>{{ module.name }}
</el-checkbox>
<div
v-for="(group, ) in module.groups"
:key="group.code"
class="permission-box-group">
<el-checkbox
v-model="group.checked"
:indeterminate="group.indeterminate"
@change="handleCheckAll($event,group.permissions,'permissions')"
>
{{ group.name }}
</el-checkbox>
<div
class="permission-box-permission-container"
:class="{'permission-box-profile-container': group.code == 'EXTENSION_LIBRARIES'}">
<div
v-for="(permission, ) in group.permissions"
:key="permission.code"
class="permission-box-permission">
<el-checkbox
v-model="permission.checked"
>{{ permission.description }}</el-checkbox>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
export default {
props: {
authList: Array as PropType<AuthType[]>
},
data() {
return {
// search: {},
};
},
watch: {
authList: {
handler(val){
val.forEach(sysAuth => {
sysAuth.permissionVo.modules.forEach((module) => {
module.groups.forEach(group => {
const { checked, indeterminate } = computeChecked(group.permissions);
group.checked = checked;
group.indeterminate = indeterminate;
});
const { checked, indeterminate } = computeChecked(module.groups);
module.checked = checked;
module.indeterminate = indeterminate;
});
const { checked, indeterminate } = computeChecked(sysAuth.permissionVo.modules);
sysAuth.checked = checked;
sysAuth.indeterminate = indeterminate;
});
},
deep: true,
immediate: true
}
},
mounted() {
},
methods: {
handleCheckAll(val, arr, type){
switch (type) {
case 'modules':
arr.forEach(module => {
module.groups.forEach(group => {
group.permissions.forEach(permission => {
permission.checked = val;
});
});
});
break;
case 'groups':
arr.forEach(group => {
group.permissions.forEach(permission => {
permission.checked = val;
});
});
break;
case 'permissions':
arr.forEach(item => {
item.checked = val;
});
break;
default:
break;
}
},
}
};
</script>
export function computeChecked(arr){
let checkedCount = 0;
let hasChildIndeterminate = false;
arr.forEach(item => {
if (item.checked) {
checkedCount++;
}
if (item.indeterminate){
hasChildIndeterminate = true;
}
});
return {
checked: !!checkedCount,
indeterminate: hasChildIndeterminate || (!!checkedCount && checkedCount < arr.length)
};
}
你期待的结果是什么?实际看到的错误信息又是什么?
各位大佬有没有更加优雅或者简单处理方式?
预期效果 树形权限效果图
以上是 如何优化复选框(el-checkbox)对于树形结构数据的应用 ? 的全部内容, 来源链接: utcz.com/p/933161.html