el-tree 中数据回显的注意点

前言

前几天写项目时候遇到一个数据回显的小问题,当时解决后忘记记录了,今天来码一码

el-tree的结构

<el-tree
    style="margin: 20px 0"
    ref="tree"
    :data="allMenuList"
    node-key="id"
    show-checkbox
    default-expand-all
    :props="defaultProps"
/>

data - 展示数据(原始的列表)
node-key - 唯一标识
default-expand-all - 是否默认展开所有节点
show-checkbox - 节点是否可被选择

lazy - 是否懒加载子节点,需与 load 方法结合使用
current-node-key - 当前选中的结点

当然在获取原始列表之后,我们还需要根据当前所选中的 id 来查询其所有的idList
最终通过idList进行数据回显

    this.$refs.tree.setCheckedKeys(this.idList)

注意 : 这里的idList封装或不封装成树形结构都是ok的

问题定位

然而完成上述配置后,并没有正确回显所有数据,父节点以下的内容会全部被选中🙃

 

图中可以看到全选和半选的区别,当我们选中parent-node时,其下所有的子节点都会被选中!! 由于在数据库中存储的数据是按层级存储的 例如 parent-id -> sub-parent-id -> node-id
所以说 存储的子节点必有其父节点存在,所以所有数据都会被选中

解决方案

根据上述分析我们只需要删除父节点,转而保留所有的子节点即可

public Result getAssignByRoleId(@PathVariable("id") Long id){
    //获取给该角色分配的idList
    List<Long> idList = sysRoleMenuService.getAssign(id);

    //通过idList获取到完整的菜单列表
    LambdaQueryWrapper<SysMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.in(SysMenu::getId,idList).eq(SysMenu::getStatus,1);
    List<SysMenu> roleMenuList = sysMenuService.list(lambdaQueryWrapper);
    //获取树形结构,这部很重要
    List<SysMenu> node = sysMenuService.getNode(roleMenuList);
    //去除父节点
    List<Long> subList = getSubIdList(node,new ArrayList<Long>());

    return Result.success(subList);
}
//递归去除父结点
private List<Long> getSubIdList(List<SysMenu> roleMenuList,List<Long> subList) {
    for(SysMenu sysMenu : roleMenuList){
        if(sysMenu.isSelect())//判断是否已经处理过
            continue;

        List<SysMenu> children = sysMenu.getChildren();
        if(CollectionUtils.isEmpty(children)) {//只留最里的节点
            subList.add(sysMenu.getId());
            sysMenu.setSelect(true);
        }
        else
            subList = getSubIdList(children,subList); //有孩子就一直递归到没有孩子
    }
    return subList;
}

下面是Menu类中定义的两个属性 - 方便形成树形结构

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值