效果图

需求是做一个这种的多层级表格,树形数据表格。

大家可能遇到的问题

一种是不知道如何做这种多层级的表格
一种是后台给自己返回的数据不是树形的,也就是没有子父级。全是一条条的扁平化数组。类似这样

而我们需要的结构是这样

那么问题就来了,我们如何把这一段数据给处理转换成树形结构呢。

我在网上看了好多的帖子学习,发现很多都是写的很复杂或者只写了一部分,那我就来弄一个全覆盖的额好了,从如何做表,到万一给你的是扁平数组如何转换成树行的。一次搞定

扁平数组转换树形结构方法

这个也是网上看到一个算法大佬的写法,经过测试,确实有效,而且特别简便。

    setTreeData(source){let cloneData = JSON.parse(JSON.stringify(source))      // 对源数据深度克隆return  cloneData.filter(father=>{                      // 循环所有项,并添加children属性let branchArr = cloneData.filter(child=> father.menuId == child.parentId);   // 返回每一项的子级数组branchArr.length>0 ? father.children=branchArr : ''   //给父级添加一个children属性,并赋值return father.parentId==0;      //返回第一层});

解释一下用法:

1,你需要发请求获取后台给你的数组,然后在你的.then()内调用这个setTreeData方法,并把你们的数组传参过去,比如这样this.setTreeData(data),这个data就是你请求拿到的数据。
2,你需要看一下这里面的father.menuId这句话,他对应的是id,因为我的项目后台返回的id他取名是menuId所以我改成了menuid,你们要看下自己的数据里是id还是什么其他名字,修改一下就能用了,后面的parentId我看了很多人的数据,基本都是一样的名字,没有人动这个的,如果不一样,那也需要改一下。

解释一下逻辑:

很简单的逻辑,首先把拿到的数据克隆一份存到cloneData变量内,然后循环这个变量,两个filter循环的逻辑是把第一项的id和所有项的parentId做比较,parentId代表上级菜单,一般这个上级菜单写的就是上级菜单的id一样的,所以我们比较一下,如果是一致的,那就代表这个是第一项的子级,那就返回这一项到branchArr内。一直循环比较完毕后,接下继续循环第二项,还是一样第二项的id和所有项的parentId比较找一样的给到branchArr内,然后第三项,第四项以此类推把所有id都比较一遍后就找到了所有id对应的子级,这时候判断branchArr长度大于0吗,如果大于代表有子级,那就创建一个childern字段,值就是branchArr的数据。最后把parentId==0的返回,等于0代表没有上级菜单,那他就是最顶级的菜单,所以他返回了就是第一层的菜单。

好啦,到这里大家应该懂了这个树形转换的逻辑了吧。那我们开始说如何把表格做出来。
这就需要用到我们的elementul组件了,非常方便。

树形数据表格

<template>
<div><el-table:data="tableData"style="width: 100%;margin-bottom: 20px;"row-key="id"borderdefault-expand-all:indent="20":tree-props="{children: 'children', hasChildren: 'hasChildren'}"><el-table-columnprop="date"label="日期"sortablewidth="180"></el-table-column><el-table-columnprop="name"label="姓名"sortablewidth="180"></el-table-column><el-table-columnprop="address"label="地址"></el-table-column></el-table>
</div>
</template>
<script>export default {data() {return {tableData: [ {id: 3,date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄',children: [{id: 31,date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄'}, {id: 32,date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄',children: [{id: 34,date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄'}, {id: 35,date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄'}]}]}, {id: 4,date: '2016-05-03',name: '王小虎',address: '上海市普陀区金沙江路 1516 弄'}],}},methods: {load(tree, treeNode, resolve) {setTimeout(() => {resolve([{id: 31,date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄'}, {id: 32,date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄'}])}, 1000)}},}
</script>

解释一下写法:

这其时就是elementul官网上复制的一段代码,table表格组件有一个树形数据与懒加载的表格可以参考。
重点说一下注意点。
写在el-table标签上的属性意思解释:

两个必须要写的,row-key="id"这个id对应你的数据的id或者像我一样的menuId。反正别重复,是一个标记区分的作用。tree-props的意思是,再你的数据内如果哪一条有children字段就展开,里面放子级,刚好我们刚才数据已经转换了,现在里面有children字段了可以用来判断,这个地方注意的是children: 'children’这个前面不能改,后面的名字可以改,根据你数据里面的子级字段改,比如我们正常人的子级都是用children表示,如果你们公司的后端比较叛逆偏偏要用ABC来表示,那就是children: 'ABC’懂吧。
至于后面的hasChildren: 'hasChildren’基本用不到。

row-key="id"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"

这个indent意思就是你表格展开后的偏移量,每一级首行缩进多少。也是加在el-table上的属性

:indent="20"

还可以在el-table上加一个lazy属性,代表了子级懒加载。

如果你想要单独弄一行来放小箭头用于展开表格那你就再最前面加一个el-table-column就可以,默认第一个el-table-column放箭头

如果你想要控制箭头的位置不放在第一个el-table-column怎么做呢,很简单,给他家type属性,加了type的el-table-column小箭头就不会去会往后找没有type 的,所以你只需要把前面的都加上type在你需要的那一个el-table-column上不加type就可以控制箭头在哪里了。

【通俗易懂】vue-elementul实现树形数据表格,后台返回的扁平化数组进行树形结构转换处理相关推荐

  1. 大数据量树形数据表格展示, 虚拟表格,el-table, umy-ui, 表格懒加载

    1. 出现的问题 要展示树形数据表格,根据当前点击的表格行去请求新的数据并展示, 基于这种情况遇到以下问题 1). 当树形表格数据层级大于五级且数据量较多时, 浏览器崩溃 2). 当数据条数展示超出5 ...

  2. 微信小程序自定义组件-树形数据表格(进阶版)

    前言 一.下载引用 二.使用treegrid组件 三.使用文档 属性 事件 四.组件源码 利用递归思想编写的表格行--treegrid-treeline 树形表格--treegrid-treegrid ...

  3. Layui实现TreeTable(树形数据表格)

    参考 Layui实现TreeTable(树形数据表格) LayUI树形表格treetable使用详解 gitee:ele-admin / treetable-lay 文中涉及的treetable.js ...

  4. vue+element实现树状表格的增删改查;使用el-table树形数据与懒加载实现树状表格增删改查

    以下代码可以直接复制使用 一.情景: 列表是一个树状表格,可以无限添加下级,以及对列表的某一行进行增删改查(目前查没有写). 原博链接 二.本篇是在原博主的代码基础上添加了部分功能. 功能1: 给树状 ...

  5. 大数据量树形数据表格展示, umy-ui,

    ​前端树形表格展示通过使用umyui组件 ​参考umyui官网的 一个基于 vue 的 PC 端表格UI库,解决万级数据渲染卡顿问题,过万数据点击全选卡顿等等问题. 博主也查阅过资料,也有使用过ele ...

  6. VUE layui之table数据表格使用详细说明

    步骤: 一:layui官网下载包 二:将解压的文件放入static文件夹(如果没有就在根目录下新建一个) 三:public文件下index.html中引入css及js文件 <!-- 引入 lay ...

  7. vue向后端发送数据并得到返回值

    window.onload = function(){var vm = new Vue({el:'#box',data:{msg:'Hello World!',},methods:{get:funct ...

  8. 请求数据,后台返回上千条上万条数据,怎么办

    1.让后端实行分页查询返回数据,否则跑路或者跟经理一起打后端一顿. 2.直接渲染,卡死用户.浏览器可以处理不过在渲染的时候会卡顿. 3.文档片段. 以前,每次创建 div 元素时,都会通过 appen ...

  9. vue二进制转图片显示问题 后端返回的是byte[]数组

    1.二进制转图片显示问题 代码 lookPreview(this.previewID).then(response => {this.previewUrl = "data:image/ ...

最新文章

  1. CNN卷积层图像和矩阵转换函数
  2. xss Payload
  3. 使用Seata彻底解决Spring Cloud中的分布式事务问题!
  4. 基于AppDomain的插件式开发
  5. JVM详解之:类的加载链接和初始化
  6. kernel panic 和 kernel Oops
  7. C语言计算分段函数pta,PTA浙大版《C语言程序设计(第3版)》题目集 练习2-11 计算分段函数[2] (10分)...
  8. 【JAVA基础】一:聊聊笔试常见到的 “==、equal” 比较是否相等的内在差别
  9. Linux 在 soft lockup 时,可以远程调试吗?
  10. centos8安装nginx
  11. 拉普拉斯变换的matlab仿真,拉普拉斯变换的Matlab求解方法
  12. java合并果子_合并果子(经典优先队列)
  13. 支付宝 java 签名_支付宝APP支付(Java后台生成签名具体步骤)
  14. Python学习知识清单(基础+进阶)
  15. python @property 解释
  16. JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探
  17. “众里寻她千百度”情人节
  18. 基于微信小程序付费自习室系统(微信小程序毕业设计)
  19. 详解TP-Link路由器设置(图解)
  20. alertdialog旋转屏幕消失造成leak window

热门文章

  1. 搜索引擎蜘蛛爬虫 User Agent 一览(便于采集)
  2. html 苹果xr媒体查询,iPhone的CSS3媒体查询_html/css_WEB-ITnose
  3. ASL、AVL 知识学习
  4. 六款顶级桌面美化软件推荐(Windows)
  5. 离散数学笔记Discrete Mathematics
  6. Beats:如何在 Docker 容器中运行 Filebeat
  7. Git | 常用 指令
  8. 大脑的弥天大谎:为什么我们误把渴望当幸福
  9. android 布局文件中控件ID、name标签属性的命名包含“@”、“.”、“+”等等符号的含义...
  10. Python-GET/POST请求(urllib.request与requests)使用Python测试POST接口(代替postman)