vxe-table中树形结构

news2024/12/27 9:39:50

如图,同事让帮忙实现一个需求

 从二级树节点开始,同时选中的只能有一个二级树节点,选中的二级树节点之下的子节点都可以被选中。否则不能被选中

直接上代码

需要注意的是,文中树状图传递的数据是打平的数据,设置代码是下图,而不是树状图!!

:tree-config="{transform: true, rowField: 'cguid', parentField: 'cparentid'}" 

 上述的这一点非常重要

下面的全乎的数据图

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <!-- import CSS -->
  <!-- 引入样式 -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vxe-table@legacy/lib/style.css">
  <!-- 引入vue -->
  <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
  <!-- 引入组件 -->
  <script src="https://cdn.jsdelivr.net/npm/xe-utils"></script>
  <script src="https://cdn.jsdelivr.net/npm/vxe-table@3.6.9"></script>
  <script src="data.js"></script>
</head>

<body>
  <div id="app">
    <vxe-table ref="treeNode" resizable :tree-config="{transform: true, rowField: 'cguid', parentField: 'cparentid'}" :data="tableData"
      :checkbox-config="{labelField: 'cguid', highlight: true,visibleMethod:()=>true,checkMethod:()=>true}"
      @checkbox-change="selectChangeEvent">
      <vxe-column type="checkbox" title="ID" width="280" tree-node></vxe-column>
      <vxe-column field="cname" title="Name"></vxe-column>
    </vxe-table>
  </div>
</body>
1:删除
2:节点禁用
3:筛选
<script>
  new Vue({
    el: '#app',
    data: function () {
      return {
        tableData: [], 
        chooseDataTree: null,//选中的树节点的内容
        data2tree: [],//将打平数据封装成树结构
      }
    },
    created() {
      this.tableData = dataList;
      //将数据改为树状结构
      children = getJsonTree(dataList, '000000');
      //遍历需要这种结构
      this.data2tree = {
        cguid: "000000",
        children,
      }
    },
    methods: {
      selectChangeEvent({ $table, indeterminates, row, records }) {
        console.log(arguments) 
        //将当前选中的数据 被选中子节点到root的数据
        this.handleCheckChange([...records, ...indeterminates],row)
      },
      handleCheckChange(data,row) {
        //整理成树状图 
        let chooseTree = getJsonTree(data, '000000') 
        //当前选中节点是不是在第一次选中的树节点中
        let bool = this.checkMethod({row,chooseTree,chooseList:data})
        console.log('bool:',bool)
        //不再就不让勾选,同时提示
        if(!bool){
          this.$refs.treeNode.setCheckboxRow(row,false)
          VXETable.modal.message('当前无法被选中')
        }
      }, 
      checkMethod({ chooseList,row ,chooseTree}) {
        //有选中的数据
        if (chooseList.length > 0 ) { 
          //已经存在选中的tree
          if(this.chooseDataTree){
            //已经选中的tree中是否存在当前选中的项
            let haveBool = hasChildNode(this.chooseDataTree, row.cguid);
            return haveBool
          }
          //获取选中的树表格 
          let chooseTreeData = chooseTree[0];
          //从树表格中获取第二级的节点(只有选中节点数据)
          let leve2Item = chooseTreeData.children[0];
          //从完整的树表中获取完整的指定节点数据
          let getThenTree = getLeafNode(this.data2tree, leve2Item.cguid); 
          //将选中的二级节点保存起来 用于校验
          this.setChooseDataTree(getThenTree);
          //检查当前节点是不是在选中的二级节点之中 
          let haveBool = hasChildNode(getThenTree, row.cguid);
          console.log('getThenTree:',getThenTree.cname,getThenTree);
          console.log('row:',row.cname,row)
          return haveBool
        } else {
          console.log('选中的内容空空如也')
          //将选中内容置空
          this.setChooseDataTree(null);
          return true
        }
      },
      //设置选中后的数据内容
      setChooseDataTree(data){
        this.chooseDataTree = data
      }
    }

  })

  //讲打平的数据组将组为树状图
  function getJsonTree(data, cparentid) {
    var result = [], temp;
    for (var i = 0; i < data.length; i++) {
      if (data[i].cparentid == cparentid) {
        if (cparentid === "000000") data[i]['disabled'] = true;
        var obj = { "name": data[i].cname, "id": data[i].cguid };
        obj = Object.assign(obj, data[i]);
        temp = this.getJsonTree(data, data[i].cguid);
        if (temp.length > 0) {
          obj.children = temp;
        }
        result.push(obj);
      }
    }
    return result;
  }
  //指定的节点中是否包含相应的子节点
  function hasChildNode(root, cguid) {
    if (root == null) {
      return false;
    }
    if (root.cguid === cguid) {
      return true;
    }
    let found = false;
    if (root.children && root.children.length > 0) {
      root.children.forEach(child => {
        if (hasChildNode(child, cguid)) {
          found = true;
        }
      });
    }
    return found;
  }
  //从树的表格中获取指定字节点内容数据
  function getLeafNode(root, cguid) {
    if (root == null) {
      return null;
    }
    if (root.cguid == cguid) {
      return root;
    }
    let result = null;
    if (root.children && root.children.length > 0) {
      root.children.forEach(child => {
        const leafNode = getLeafNode(child, cguid);
        if (leafNode != null) {
          result = leafNode;
        }
      });
    }
    return result;
  }



</script>

</html>

json打平的数据结构是

const dataList = [
    {
        "cguid": "5422",
        "ccode": "01",
        "cname": "01 资产",
        "cparentid": "000000",
        "ileaf": "0"
    },
    {
        "cguid": "70",
        "ccode": "1004",
        "cname": "1004 汇总科目",
        "cparentid": "5422",
        "ileaf": "0"
    },
    {
        "cguid": "78",
        "ccode": "100401",
        "cname": "100401 汇总科目1",
        "cparentid": "70",
        "ileaf": "1"
    },
    {
        "cguid": "95",
        "ccode": "100402",
        "cname": "100402 汇总科目2",
        "cparentid": "70",
        "ileaf": "1"
    },
    {
        "cguid": "47",
        "ccode": "100403",
        "cname": "100403 汇总科目3",
        "cparentid": "70",
        "ileaf": "1"
    },
    {
        "cguid": "87",
        "ccode": "100404",
        "cname": "100404 汇总科目4",
        "cparentid": "70",
        "ileaf": "0"
    },
    {
        "cguid": "97",
        "ccode": "10040401",
        "cname": "10040401 汇总科目4-1",
        "cparentid": "87",
        "ileaf": "1"
    },
    {
        "cguid": "41",
        "ccode": "90000201",
        "cname": "90000201 B2c1",
        "cparentid": "31",
        "ileaf": "1"
    },
    {
        "cguid": "77",
        "ccode": "90000202",
        "cname": "90000202 B2c2",
        "cparentid": "31",
        "ileaf": "1"
    },
    {
        "cguid": "428",
        "ccode": "1001",
        "cname": "1001 库xxx",
        "cparentid": "422",
        "ileaf": "1"
    },
    {
        "cguid": "430",
        "ccode": "1002",
        "cname": "1002 银xxx",
        "cparentid": "422",
        "ileaf": "1"
    },
    
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[集创赛海云捷讯杯]全国二等奖经验分享

[集创赛海云捷讯杯]全国二等奖经验分享 一.前言二.我们的作品三.小结 一.前言 笔者是研一在校生&#xff0c;从五月份开始和本科生一起卷集创赛&#xff0c;经历初赛&#xff0c;分赛区决赛&#xff0c;全国总决赛&#xff0c;认识了很多一起做比赛的朋友收获颇丰。今年海云杯…

记录一次可视化大屏开发

版本&#xff1a;echarts5.3.0 - echarts-gl2.0.8 echarts大部分问题都是版本原因&#xff0c;4.x和5.x区别很大&#xff0c;推荐^5.3.0&#xff0c;因为有些api需要这个版本以上才支持。另外5.1支持svg地图数据格式&#xff0c;与之前的一些用法截然不同&#xff0c;同时拓展性…

(动态规划) 剑指 Offer 60. n个骰子的点数 ——【Leetcode每日一题】

❓ 剑指 Offer 60. n个骰子的点数 难度&#xff1a;中等 把 n 个骰子扔在地上&#xff0c;所有骰子朝上一面的点数之和为 s 。输入 n&#xff0c;打印出s的所有可能的值出现的概率。 你需要用一个浮点数数组返回答案&#xff0c;其中第 i 个元素代表这 n 个骰子所能掷出的点…

国民八路参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.

国民八路参考文献&#xff1a;&#xff3b;&#xff18;&#xff3d;许少辉&#xff0e;乡村振兴战略下传统村落文化旅游设计&#xff3b;&#xff2d;&#xff3d;北京&#xff1a;中国建筑工业出版社&#xff0c;&#xff12;&#xff10;&#xff12;&#xff12;&#xff0…

Grid布局详解-看这篇就够了

Grid网格布局的概念&#xff0c;和flex布局的区别 含义&#xff1a;它将网页划分成一个个网格&#xff0c;可以任意组合不同的网格&#xff0c;做出各种各样的布局 区别&#xff1a;Gid布局与Flex布局有一定的相似性&#xff0c;都可以指定容器内部多个项目的位置。但是&#…

Autosar存储入门系列04_NvM的CRC比较机制及同/异步写

本文框架 0.前言1. NvM的CRC校验1.1 CRC 比较机制 2. NvM的同步写及异步写2.1 NvM的同步写2.1 NvM的异步写 0.前言 本系列是Autosar存储入门系列&#xff0c;希望能从学习者的角度把存储相关的知识点梳理一遍&#xff0c;这个过程中如果大家觉得有讲得不对或者不够清晰的地方&…

【09期】HashMap常见面试题

简介 HashMap最早出现在JDK1.2中&#xff0c;底层基于散列算法实现。HashMap 允许 null 键和 null 值&#xff0c;是非线程安全类&#xff0c;在多线程环境下可能会存在问题。 1.8版本的HashMap数据结构&#xff1a; 为什么有的是链表有的是红黑树&#xff1f; 默认链表长度大…

Postman脚本批量转接口自动化用例

1、前言 作者之前已经开发了一个生成接口用例的工具 - API接口用例生成器&#xff0c;即将现有的 Postman 脚本转化为接口用例。本篇介绍另一款最近刚开发并项目落地的工具&#xff0c;将 Postman 的 json 脚本文件可以批量转换生成接口用例 - APICase-PostmanForJSON。 2、简…

jmeter接口测试及详细步骤以及项目实战教程

在接口测试项目实战中&#xff0c;JMeter是一款非常强大和流行的自动化测试工具&#xff0c;它可以测试各种类型的应用程序&#xff0c;并通过采样和报告来识别性能瓶颈和API的问题。本文将为你提供一个基于实际项目的JMeter接口测试项目实战教程&#xff0c;指导你如何使用JMe…

驱动day10

练习 基于platform实现 设备树 myplatform_homework{compatible "hqyj,myplatform_homework"; //用于获取节点reg <0x12345678 14>;interrupt-parent <&gpiof>; //引用父节点interrupts <9 0>; //这个节点引入的中断管脚led1-gpi…

Git 简单介绍

Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 一、Git 安装 windows安装&#xff1a;进入网站 https://git-scm.com/ 安装&#xff0c;ubuntu配置&#xff1a;apt install git。当前于 Win 下已安装 Git 版本 2.40.1。 二、配置 设…

ModStartBlog v8.1.0 博客密码访问,内容编辑升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …

LLMs之Code:SQLCoder的简介、安装、使用方法之详细攻略

LLMs之Code&#xff1a;SQLCoder的简介、安装、使用方法之详细攻略 目录 SQLCoder的简介 1、结果 2、按问题类别的结果 SQLCoder的安装 1、硬件要求 2、下载模型权重 3、使用SQLCoder 4、Colab中运行SQLCoder 第一步&#xff0c;配置环境 第二步&#xff0c;测试 第…

Jetson Xavier NX安装torch环境

设备简介 Jetson Xavier NX是一款具有强大计算能力的AI处理器&#xff0c;它采用了NVIDIA的Turing架构和Volta GPU架构&#xff0c;可以实现高性能的深度学习和推理任务。具体性能如下&#xff1a; CPU&#xff1a;6核心ARM Cortex-A57处理器&#xff0c;最高主频1.5GHz。 GP…

一文讲透 JavaScript 应用的演进历程

在不断发展的软件开发领域中&#xff0c;很少有编程语言像JavaScript一样产生深远的影响。它起初只是一种简单的脚本语言&#xff0c;但如今已成为现代Web的驱动力量&#xff0c;改变了应用构建和体验的方式。本文将带你沿着时间线&#xff0c;穿越JavaScript的演进历程&#x…

【网络BSP开发经验】Linux gmac驱动调试(FH8626)

文章目录 Linux网络设备驱动简介Linux网卡驱动网络协议接口层网络设备接口层设备驱动功能层网络设备与媒介层linux驱动数据结构linux驱动注册过程网络设备驱动的注册与注销linux驱动数据包收发流程 Linux PHY驱动MDIO接口PHY简介PHY关联过程PHY状态机对端MAC情况&#xff08;接…

便携式水质检测仪都测哪些水中指标

水质检测仪分为实验室&#xff08;台式&#xff09;和户外使用的便携式多参数水质检测仪。 便携式的有哪些特点&#xff1f; 相对于实验室的水质分析设备&#xff0c;便携式水质多参数分析仪体积小巧&#xff0c;结构简单&#xff0c;户外使用更加便捷&#xff0c;功能更丰富。…

OLED透明屏暗斑问题解析:原因、解决方案与行业趋势

OLED透明屏作为一项创新技术&#xff0c;广泛应用于广告、零售和汽车等领域&#xff0c;其高透明度和出色的显示效果备受青睐。 然而&#xff0c;一些用户反映在使用过程中出现了暗斑问题&#xff0c;影响了显示效果。 那么&#xff0c;在这篇文章中&#xff0c;尼伽将和大家…

RT_Thread内核机制学习(六)互斥量

互斥量 互斥量是特殊的信号量&#xff0c;资源个数只能是0、1&#xff0c;实现了优先级继承。 互斥量优点&#xff1a;谁拥有谁释放&#xff0c;优先级继承。 信号量的缺点&#xff1a;谁都可以释放信号量、优先级反转。 HP被MP抢占&#xff0c;优先级反转。 互斥量实现了优…

MySQL备份和还原

前言 mysql日志默认保存在/usr/local/mysql/data 常见的日志&#xff1a; 1、错误日志 2、一般查询日志 3、二进制日志 4、中继日志 5、重做日志 6、回滚日志 7、慢查询日志 配置文件位置 vim /etc/my.cnf 错误日志&#xff0c;用来记录当MySQL启动、停止或运行时发生的错误信…