使用 el-tree 实现计算每个非叶子节点的后代节点的个数并显示

简介: 本文介绍了如何使用ElementPlus的`el-tree`组件实现计算并显示每个非叶子节点后代节点的个数,以及后代节点中ID为一万倍数的个数。

前言

今天实现一个这样的 Web 前端需求,给定一个嵌套结构的 json 数据,计算每个非叶子节点中,其后代节点的个数,以及其后代节点中ID为一万倍数的个数,在此简单记录一下。

一、示例代码

(1)/src/views/Example/computeNodesNumber/index.vue

<template>
  <div style="padding: 100px; background-color: #eee">
    <el-tree
      :data="treeData"
      :props="defaultProps"
      :show-checkbox="true"
      :default-expand-all="true"
      :highlight-current="true"
      :expand-on-click-node="false"
      :indent="22"
    >
      <template #default="{ node, data }">
        <span v-if="!node.isLeaf" style="display: flex; align-items: center;">
          <el-icon v-if="node.expanded" style="margin: 0 6px 0 0px;" size="16"><FolderOpened /></el-icon>
          <el-icon v-else style="margin: 0 6px 0 0px;" size="16"><Folder /></el-icon>

          <small @click="handleNodeClick(node, data)">
            <i style="color: blue">{
  
  { data.id }}</i>
            {
  
  { node.label }}
          </small>

          <b style="margin-left: 5px; padding: 0 3px; background-color: #eee; border: 1px solid #aaa;border-radius: 4px; color: #888; font-size: 13px;">
            子节点个数:<i style="color: red">{
  
  { handleComputeNodesNumber(data) }}</i>
          </b>

          <b style="margin-left: 5px; padding: 0 3px; background-color: #eee; border: 1px solid #aaa;border-radius: 4px; color: #888; font-size: 13px;">
            子节点中ID为10000倍数的个数:<i style="color: deeppink">{
  
  { handleComputeNodesNumber_10000(data) }}</i>
          </b>
        </span>

        <span v-else style="display: flex; align-items: center;">
          <el-icon style="margin: 0 6px 0 0px;" size="16"><Document /></el-icon>

          <small @click="handleNodeClick(node, data)">
            <i style="color: cornflowerblue">{
  
  { data.id }}</i>
            {
  
  { node.label }}
          </small>
        </span>
      </template>
    </el-tree>
  </div>
</template>

<script>
import * as treeObj from './tree.json'
const treeData = treeObj.default
const defaultProps = {
    
    
  children: 'children',
  label: 'label',
}

export default {
    
    
  data() {
    
    
    return {
    
    
      treeData: treeData,
      defaultProps: defaultProps,
    }
  },
  mounted() {
    
    
    console.log(treeObj)
  },
  methods: {
    
    
    /**
     * 计算子节点个数句柄方法
     */
    handleComputeNodesNumber(data) {
    
    
      // 当前节点的数据
      const nodeData = data
      console.log(nodeData)

      // 计算这个节点的叶子节点总数
      let sum = 0
      sum = this.computeNodesNumberAssist(0, nodeData.children)
      console.log('sum =>', sum)
      return sum
    },

    /**
     * 计算子节点个数辅助方法
     */
    computeNodesNumberAssist(sum, tree) {
    
    
      for (let i in tree) {
    
    
        sum++

        if (tree[i].children) {
    
    
          sum += this.computeNodesNumberAssist(0, tree[i].children)
        }
      }

      return sum
    },

    /**
     * 计算子节点中ID为10000倍数的个数句柄方法
     */
    handleComputeNodesNumber_10000(data) {
    
    
      // 当前节点的数据
      const nodeData = data
      console.log(nodeData)

      // 计算这个节点的符合的叶子节点总数
      let sum = 0
      sum = this.computeNodesNumberAssist_10000(0, nodeData.children)
      console.log('sum =>', sum)
      return sum
    },

    /**
     * 计算子节点中ID为10000倍数的个数辅助方法
     */
    computeNodesNumberAssist_10000(sum, tree) {
    
    
      for (let i in tree) {
    
    
        if ((tree[i].id % 10000) == 0) {
    
    
          sum++
        }

        if (tree[i].children) {
    
    
          sum += this.computeNodesNumberAssist_10000(0, tree[i].children)
        }
      }

      return sum
    },

    /**
     * 树节点点击事件句柄方法
     */
    handleNodeClick(node, data) {
    
    
      console.log('handleNodeClick =>', node, data)
    }
  },
};
</script>

(2)/src/views/Example/computeNodesNumber/tree.json

[
    {
   
   
        "id": 1,
        "label": "香烟 WiFi 啤酒"
    },
    {
   
   
        "id": 2,
        "label": "后端开发技术",
        "children": [
            {
   
   
                "id": 3,
                "label": "Java后端",
                "children": [
                    {
   
   
                        "id": 5,
                        "label": "Spring MVC",
                        "children": [
                            {
   
   
                                "id": 15,
                                "label": "AOP 面向切面编程",
                                "children": [
                                    {
   
   
                                        "id": 750000,
                                        "label": "切面(aspect)"
                                    },
                                    {
   
   
                                        "id": 760000,
                                        "label": "横切关注点"
                                    },
                                    {
   
   
                                        "id": 770000,
                                        "label": "连接点(joinpoint)"
                                    },
                                    {
   
   
                                        "id": 780000,
                                        "label": "切入点(pointcut)"
                                    },
                                    {
   
   
                                        "id": 790000,
                                        "label": "通知(advice)"
                                    },
                                    {
   
   
                                        "id": 800000,
                                        "label": "目标对象"
                                    },
                                    {
   
   
                                        "id": 810000,
                                        "label": "织入(weave)"
                                    }
                                ]
                            },
                            {
   
   
                                "id": 16,
                                "label": "IOC 控制反转",
                                "children": [
                                    {
   
   
                                        "id": 410000,
                                        "label": "依赖查找"
                                    },
                                    {
   
   
                                        "id": 420000,
                                        "label": "依赖注入"
                                    }
                                ]
                            }
                        ]
                    },
                    {
   
   
                        "id": 6,
                        "label": "Hibernate",
                        "children": [
                            {
   
   
                                "id": 110000,
                                "label": "HSQL Database Engine"
                            },
                            {
   
   
                                "id": 120000,
                                "label": "DB2/NT"
                            },
                            {
   
   
                                "id": 130000,
                                "label": "MySQL"
                            },
                            {
   
   
                                "id": 140000,
                                "label": "PostgreSQL"
                            },
                            {
   
   
                                "id": 150000,
                                "label": "FrontBase"
                            },
                            {
   
   
                                "id": 160000,
                                "label": "Oracle"
                            },
                            {
   
   
                                "id": 170000,
                                "label": "Microsoft SQL Server Database"
                            }
                        ]
                    }
                ]
            },
            {
   
   
                "id": 4,
                "label": "Web 前端",
                "children": [
                    {
   
   
                        "id": 13,
                        "label": "Vue",
                        "children": [
                            {
   
   
                                "id": 260000,
                                "label": "响应式"
                            },
                            {
   
   
                                "id": 290000,
                                "label": "条件渲染"
                            },
                            {
   
   
                                "id": 420000,
                                "label": "列表渲染"
                            },
                            {
   
   
                                "id": 500000,
                                "label": "事件处理"
                            },
                            {
   
   
                                "id": 510000,
                                "label": "生命周期"
                            },
                            {
   
   
                                "id": 620000,
                                "label": "侦听器"
                            },
                            {
   
   
                                "id": 650000,
                                "label": "插槽"
                            },
                            {
   
   
                                "id": 720000,
                                "label": "依赖注入"
                            },
                            {
   
   
                                "id": 730000,
                                "label": "异步组件"
                            }
                        ]
                    },
                    {
   
   
                        "id": 14,
                        "label": "React",
                        "children": [
                            {
   
   
                                "id": 310000,
                                "label": "虚拟DOM"
                            },
                            {
   
   
                                "id": 320000,
                                "label": "Diff算法"
                            }
                        ]
                    },
                    {
   
   
                        "id": 48,
                        "label": "Angular"
                    },
                    {
   
   
                        "id": 58,
                        "label": "JQuery"
                    },
                    {
   
   
                        "id": 900000,
                        "label": "HTML+CSS+JS"
                    }
                ]
            }
        ]
    }
]

二、运行效果

目录
相关文章
【sgTree】自定义组件:加载el-tree树节点整棵树数据,实现增删改操作。
【sgTree】自定义组件:加载el-tree树节点整棵树数据,实现增删改操作。
|
域名解析 网络协议 算法
2022阿里云免费SSL证书申请全过程(图文详解)
阿里云SSL证书免费申请流程:先0元支付SSL证书资源包,每个阿里云账号可以一年可以申请20个免费SSL证书,然后域名DNS验证,提交CA审核后就可以下载SSL证书到本地了
51191 4
2022阿里云免费SSL证书申请全过程(图文详解)
|
新零售 数据采集 分布式计算
6000字干货分享:数据中台项目管理实践分享
本文总结了企业级数据中台项目的实践经验,希望能够为正在规划或者已在实施数据中台类项目的企业和个人提供经验。
6000字干货分享:数据中台项目管理实践分享
element中tree组件的选中获取和返显
本文介绍了如何在Element UI的tree组件中获取选中的节点值以及如何进行节点的默认选中(返显)。主要通过使用`getCheckedKeys()`和`getHalfCheckedKeys()`方法来获取完全和半选中的节点,然后使用`setCheckedKeys()`方法来设置默认选中的节点。
1506 2
element中tree组件的选中获取和返显
|
JavaScript
ElementUI的el-dialog弹窗修改设置可拖拽可最大化
该方案通过自定义Vue指令实现ElementUI的`el-dialog`弹窗的拖拽和最大化功能。只需在`main.js`中引入并注册指令,然后在Vue组件中绑定指令即可。支持自定义参数控制是否允许最大化和拖拽,并提供最大化后的回调函数。具体使用方法详见示例代码。
2332 0
ElementUI的el-dialog弹窗修改设置可拖拽可最大化
|
前端开发 虚拟化
简单记录使用 ElementPlus 的虚拟化树形控件(el-tree-v2)心得
这篇文章分享了作者使用ElementPlus的虚拟化树形控件`el-tree-v2`的心得,展示了其基本用法和如何通过自定义模板来增强树节点的交互性。
4187 1
简单记录使用 ElementPlus 的虚拟化树形控件(el-tree-v2)心得
|
前端开发 JavaScript 开发者
利用 el-select 和 el-tree 实现树形结构多选框联动功能
本文详细介绍了如何使用ElementUI中的el-select下拉选择器和el-tree树形控件来实现多功能联动选择器,包括多选、删除、搜索、清空选项等功能。通过树形控件展示复杂的层级结构,用户可以通过下拉选择树形节点,实时搜索节点,且支持批量选择和删除功能。文中提供了完整的HTML、JavaScript和CSS代码实现,帮助开发者快速集成此功能。
4961 0
利用 el-select 和 el-tree 实现树形结构多选框联动功能
|
JavaScript
如何对ElementUI、ElementPlus中的Tree树组件进行美化,如增加辅助线、替换展开收起图标、点击节点后文字高亮等效果?本文给你答案!
本文介绍了如何对ElementUI和ElementPlus的Tree树组件进行美化,包括增加辅助线、替换展开收起图标、点击节点后文字高亮等效果,并提供了详细的代码示例和实现效果。
3800 0
如何对ElementUI、ElementPlus中的Tree树组件进行美化,如增加辅助线、替换展开收起图标、点击节点后文字高亮等效果?本文给你答案!
|
人工智能 Cloud Native Serverless
从零到一:阿里云CAP助你轻松高效构建云应用
云原生应用开发平台CAP是阿里云提供的一站式应用开发及生命周期管理平台。它内置丰富的Serverless和AI应用模板、先进的开发者工具和企业级应用管理功能,帮助个人和企业开发者快速构建、部署和管理云上应用,大幅提升研发、部署和运维效能。CAP支持Web应用、AI应用、ETL数据处理等多种场景,提供图形化、低代码的流程编排能力,助力开发者高效构建复杂业务流程。
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用