最近在做这么个需求:树形结构,层级深度未知,一旦某个节点的状态是置灰的话,其所有子节点都要置灰。

方案一(数据库有值):如果数据库里置灰节点的所有子节点,值也都是"置灰",那后台取数据时就会拿到这个字段,前台直接用就可以;

方案二(后台手动赋值):如果后台在构建JSON数据的时候,把置灰节点的所有子节点都手动添加这个字段,前台也可以直接用;

方案三(前台手动赋值):如果后台接口返回给前台的出参里,置灰节点的子节点都没标这个字段值,只能前台手动添加。以Vue+ElementUI为例,代码如下:

<template>
  <div class="mainPage">
        <el-tree :data="dataDealwith" :props="defaultProps">
          <span class="custom-tree-node" slot-scope="{ node, data }">
            <span :class="data.statusIsIncorrect == 'yes' ? 'ccfont1' : ''">{{ node.label }}</span>
          </span>
        </el-tree>
  </div>
</template>
<script>
export default {
  computed: {
    dataDealwith(){
      var data = this.data;
      function setGrayNode(data){ //遍历树  获取id数组
        for(var i=0;i<data.length;i++){
          if(data[i].statusIsIncorrect == 'yes'){// 如果某一个节点是禁用的,它的所有子节点都应该禁用
            setChildrenGray(data[i].children)//子节点传给另一个函数专门用来改数据
            continue;
          } else {
            if(data[i].children){// 如果当前节点有子节点,就递归调用一次
              setGrayNode(data[i].children);
            }
          }
        }
      }
      function setChildrenGray(data){
        for(var n=0;n<data.length;n++){
          data[n].statusIsIncorrect = 'yes';// 子节点先置灰
          if(data[n].children && data[n].children.length > 0){
            setChildrenGray(data[n].children)
          }
        }
      }
      setGrayNode(data)
      return data;
    }
  },
  data() {
    return {
      data: [
        {
          label: "一级 1",
          id: "1",
          children: [
            {
              label: "二级 1-1",
              id: "1.1",
              children: [
                {
                  label: "三级 1-1-1",
                  id: "1.1.1"
                }
              ]
            }
          ]
        },
        {
          label: "一级 2",
          id: "2",
              statusIsIncorrect: 'yes',
          children: [
            {
              label: "二级 2-1",
              id: "2.1",
              children: [
                {
                  label: "三级 2-1-1",
                  id: "2.1.1"
                }
              ]
            },
            {
              label: "二级 2-2",
              id: "2.2",
              children: [
                {
                  label: "三级 2-2-1",
                  id: "2.2.1"
                }
              ]
            }
          ]
        },
        {
          label: "一级 3",
          id: "3",
          children: [
            {
              label: "二级 3-1",
              id: "3.1",
              children: [
                {
                  label: "三级 3-1-1",
                  id: "3.1.1"
                }
              ]
            },
            {
              label: "二级 3-2",
              id: "3.2",
              children: [
                {
                  label: "三级 3-2-1",
                  id: "3.2.1"
                }
              ]
            }
          ]
        }
      ],
      defaultProps: {
        children: "children",
        label: "label"
      },
    };
  },
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.mainPage {
  padding: 20px;
  color: #000;
  .el-tree {
    margin-top: 10px;
    font-size: 18px;
    .ccfont1 {color: #aaa;}
  }
}
</style>

javascript通过递归改子节点数据-用于层级深度未知的树形结构的更多相关文章

  1. LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据

    LayUi框架中树形组件tree官方还在持续完善中,目前最新版本为v2.5.5 官方树形组件目前还不支持懒加载方式,之前我修改一版是通过reload重载实例方法填充子节点数据方式,因为递归页面元素时存 ...

  2. javascript读取xml文件读取节点数据的例子

    分享下用javascript读取xml文件读取节点数据方法. 读取的节点数据,还有一种情况是读取节点属性数据. <head> <title></title> < ...

  3. c# 根据父节点id,找到所有的子节点数据

    转自:https://blog.csdn.net/q107770540/article/details/7708418 查的是表 Model_info中父节点为p_id时找到所有的子节点的集合 //通 ...

  4. 递归、嵌套for循环、map集合方式实现树形结构菜单列表查询

    有时候, 我们需要用到菜单列表,但是怎么样去实现一个菜单列表的编写呢,这是一重要的问题. 比如我们需要编写一个树形结构的菜单,那么我们可以使用JQuery的zTree插件:http://www.tre ...

  5. js 递归获取子节点所有父节点,深度遍历获取第一个子树

    前端需求. 递归 深度优先遍历算法 // 查找一个节点的所有父节点 familyTree (arr1, id) { var temp = [] var forFn = function (arr, i ...

  6. element-ui组件,全选树节点,新增数据子节点数据,出现回填问题

    案情分析:全选后父节点被选中保存,在这个树节点下新增数据时,就会出现,也被选中,事实上数据是没有被选中,也就意味着权限未被配置,而显示是已经配置了,显然这个是一个bug 1.处理前,直接用下面的方法很 ...

  7. ✅javascript 语法:附加子节点

    received: function(data) { $("#notifications").prepend(data.html); } 如何用原生js写出jquery的功能: 先 ...

  8. 使用JavaScript访问子节点方法elementNode.childNodes时,需要注意的地方

    有这样一个HTML结构 <div> javascript <p>javascript</p> <div>jQuery</div> <h ...

  9. (转)jQuery EasyUI Tree - TreeGrid动态加载子节点

    有时我们已经得到充分的分层树形网格(TreeGrid)的数据. 我们还想让树形网格(TreeGrid)按层次惰性加载节点. 首先,只加载顶层节点. 然后点击节点的展开图标来加载它的子节点. 本教程展示 ...

随机推荐

  1. Python 函数对象的本质

    Python 函数对象本质上是 function 类的实例. 1 从示例说起 def factorial(n): '''return n!''' return 1 if n < 2 else n ...

  2. C#中使用NPOI提示(找到的程序集清单定义与程序集引用不匹配)

    问题 找到的程序集清单定义与程序集引用不匹配. (异常来自 HRESULT:0x80131040) 描述 使用NPOI导出word文档,需要C#的解压缩类,所以引用了ICSharpCode.Sharp ...

  3. python初学者-判断今天是今年的第几天代码

    判断今天是今年的第几天源代码 import time date =time.localtime() year,month,day=date[:3] day_month=[31,28,31,30,31, ...

  4. SonarQube学习(一)- 使用Docker安装SonarQube(亲测可用)

    一.前言 不得不吐槽下,现在的博客写的真太扯淡了,就网上写的使用docker安装SonarQube而言,搜到十篇文章,最少9篇照着操作配置都不可用,卡在SonarQube无法启动.自然,我也是被折磨的 ...

  5. [leetcode]罗马数字和阿拉伯数字相互转换

    罗马转阿拉伯 public int romanToInt(String s) { /* 从左到右依次根据哈希表进行加法 如果是"CM"900这种情况就要执行+M和-C处理 */ i ...

  6. Java Queue 队列

    队列是一种先进先出的数据结构,队列中插入元素和删除元素分别位于队列的两端. 在Java中 队列实现类众多,本文不再赘述.本文探讨的是如何自定义队列实现类: 基于数组方式实现队列: 注意点: 当出队时队 ...

  7. JavaSwing 船只停靠管理可视化(二)

    JavaSwing 船只停靠管理可视化(一) JavaSwing 船只停靠管理可视化(二) JavaSwing 船只停靠管理可视化(三) JavaSwing 船只停靠管理可视化(四) JavaSwin ...

  8. 有两张表;使用SQL查询,查询所有的客户订单日期最新的前五条订单记录。

    客户信息表(c CUSTOM)有以下字段:id.name.mobile 客户订单表(C_ORDER)有以下字段:id.custom_id.commodity.count.order _date Sel ...

  9. 主从同步遇到 Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'时怎么解决

    首先遇到这个是因为binlog位置索引处的问题,不要reset slave: reset slave会将主从同步的文件以及位置恢复到初始状态,一开始没有数据还好,有数据的话,相当于重新开始同步,可能会 ...

  10. 关于领域驱动架构DDD思考

    一个高大上的概念领域驱动架构就这样展开. 开发了多年的软件,一直以来的习惯是拿到产品的需求 对照UI的图纸然后就干干干 碰到问题大不了找人沟通再次定义问题,最后交付.其实最后也能把一件事情完成 但如果 ...