业务场景

  根据后台返回数据生成角色权限的树形结构。获取节点数据后,当父节点被勾选时,所有的子节点全部被勾选,而实际上后台并没有返回当前父节点的所有子节点的ID,所以应该只有部分子节点被勾选。

下面第一张图是一开始填充数据后的效果,而第二张图是真正想要的效果,

解决方案

这里试过在  el-tree 上增加 :check-strictly="true" 确实也出现了右图的效果,但缺点是此时想全选,点击父节点的复选框,对应子节点复选框不会被勾上,所以此方案排除。

也试过用官方提供的  setChecked(data , false) 也未生效,这里不知道为啥没生效,参数和前提条件都有按照文档写好。

最后想的解决办法是:对数据进行过滤,选择没有子菜单的菜单ID传给树形控件,那么相应的子菜单的父节点也会半勾选上,就实现了上面右图的效果

以下是后台返回某个角色拥有的菜单ID列表 和 所有的菜单列表,都是一维数组:

首先将菜单扁平化数据转化为树状结构,这里核心是如果一个节点有父节点menuParentId,则为他的父节点创造一个children数组包含他,依次遍历;否则为祖先节点。

  buildTree2(list){
let temp = {};
let tree = [];
for(let i in list){
temp[list[i].menuitemId] = list[i];
}
for(let i in temp){
if(temp[i].menuParentId) {
if(!temp[temp[i].menuParentId].children) {
temp[temp[i].menuParentId].children = []
}
temp[temp[i].menuParentId].children.push(temp[i]);
} else {
tree.push(temp[i]);
}
}
return tree;
}
this.data2 = util.buildTree2(data.data.menuList)

其次从树状结构数据中筛选出没有子菜单的ID数组:

findNochild(arr){
arr.forEach(element => {
  if(!element.children){
  this.menuitemIdList.push(element.menuitemId)
}else{
this.findNochild(element.children)
}
});
},
this.findNochild(this.data2)//筛选出没子菜单的数组  let tempList2 = []
let tempList3 = []
tempList.forEach(element => {
tempList2.push(element.menuitemId) //后台返回的ID数组
});
tempList2.forEach(element => { //取相同的元素;
if(this.menuitemIdList.indexOf(element)>-1){
tempList3.push(element)
}
});
this.$refs.tree.setCheckedKeys(tempList3);

记录开发中element树形控件数据应用在页面上的相关问题的更多相关文章

  1. EBS OAF 开发中的OAMessageRadioGroup控件

    EBS OAF 开发中的OAMessageRadioGroup控件 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 简单介绍 RadioGro ...

  2. SharePoint2010沙盒解决方案基础开发——关于TreeView树形控件读取列表数据(树形导航)的webpart开发及问题

    转:http://blog.csdn.net/miragesky2049/article/details/7204882 SharePoint2010沙盒解决方案基础开发--关于TreeView树形控 ...

  3. Android开发中目前流行控件和知识点总结

    Android开发中目前流行控件和知识点总结   1.SlidingMenu 滑动菜单 应用案例:Facebook . Path 2.0 .人人.网易新闻 下载地址: https://github.c ...

  4. ios开发中关闭textview控件的虚拟键盘

    在ios开发中,textfield控件在点击的时候出现虚拟键盘,关掉虚拟键盘可以通过虚拟键盘中的done button和点击view中的任意地方来关闭虚拟键盘. 1.第一种方法是textfield控件 ...

  5. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的 ...

  6. 基于vue开发的element-ui树形控件报错问题解决

    对没错,这次又是ElementUI的问题,在使用ElementUI中的 tree 树形控件时需要动态添加DOM元素,但是在使用文档中给出的案例的时候会报错. 案例:ElementUI树形控件 - 自定 ...

  7. VC中的树形控件

    树形控件可以显示出各项之间的层次关系,因此在VC中很常用. 1.树形控件的常用风格 TVS_HASBUTTONS 在父项目前显示+.-.用户可以通过点击该符号来打开或收起子项 TVS_HASLINES ...

  8. C#里WinForm开发中如何实现控件随窗体大小的改变而自动适应其改变(转)

    在设计可供用户调整大小的窗体时,如何实现该窗体上的控件也应能正确地随窗体的改变而自动调整大小并且能重新定位?此时就要借助控件的.Anchor属性.Anchor属性定义控件的定位点位置.当控件锚定到某个 ...

  9. C#开发笔记,点点细微,处处真情,记录开发中的难言之隐

    该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/956 访问. 概述 本系列文章将会向大家介绍本人实际开发过程中所遇到技术 ...

  10. iOS开发:记录开发中遇到的编译或运行异常以及解决方案

    1.部署到真机异常 dyld`dyld_fatal_error: ->  0x120015088 <+0>: brk    #0x3 dyld: Library not loaded ...

随机推荐

  1. Java 21 新特性:Unnamed Patterns and Variables

    Java 21中除了推出JEP 445:Unnamed Classes and Instance Main Methods之外,还有另外一个预览功能:未命名模式和变量(Unnamed Patterns ...

  2. Codeforces Round #700 (Div. 2) A ~ D1个人题解

    Codeforces Round #700 (Div. 2) 比赛链接: Click Here 1480A. Yet Another String Game 因为Alice是要追求小,Bob追求大值, ...

  3. 如何在 Debian 12 上安装 MariaDB

    MariaDB 是一个开源多线程的关系数据库管理系统,是 MySQL 的替代品. MariaDB 是 Debian 中 MySQL 的默认替换方案. 本教程介绍如何在 Debian 12 上安装 Ma ...

  4. node开发概述

    一.Node开发概述 1. 为什么要学习服务器端开发 能够与后端程序员更加紧密的配合 网站业务逻辑前置,学习前端技术需要后端技术支撑(ajax) 扩宽知识视野,能够站在更高的角度审视整个项目 2. 服 ...

  5. Java面试——基础知识点

    JVM Jvm体系总体分四大块:类的加载机制.Jvm内存结构.GC算法垃圾回收.GC分析命令调优. 类的加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的 ...

  6. NET Core实战项目之CMS 设计篇 思维导图

    NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程 .NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程 .NET Core实战项目之CMS 第九章 设计篇 ...

  7. 基于jquery开发的Windows 12网页版

    预览 https://win12.gitapp.cn 首页代码 <!DOCTYPE html> <html lang="en"> <head> ...

  8. Shell-基本

  9. [转帖]TLS 1.2 浏览器兼容性

    https://support-splashtopbusiness.splashtop.com/hc/zh-cn/articles/4414002633883-TLS-1-2-%E6%B5%8F%E8 ...

  10. 阿里云IPV6 创建虚拟机的过程

    阿里云IPV6 创建虚拟机的过程 背景 IPV6 已经越来越广泛的应用. 想在外网开通一下IPV6,发现还有一些坑. 这里总结一下. 备忘. 开通方式 1. 登录阿里云的控制台, 打开云服务器ECS的 ...