![3dc87dee7f2c79d9b9741c2feed4920d.png](https://i-blog.csdnimg.cn/blog_migrate/8a680887f4d2389cd1827a35b7eb13b4.png)
java最优化的方法递归构造树形结构
简介
树形结构的前台页面展示在我们项目中很常用,所以小编整理了树形结构写法,目的不在于讲解内容在于可以方便大家拿到代码里面可以直接使用。做权限管理的时候经常会用到tree控件,以前前台用 jquery的时候用ztree,后来用easyui的时候框架自带了树形控件,最近在整理element ui的使用所以小编总结了element ui的树形结构的使用方法,接下来介绍的是element ui+spring boot递归构造树形结构,希望能够帮助大家,下面废话就不多说了,开始搞代码。
01
首先和大家看一下运行后的效果
![b386ed5c275ff5fdd6f9af53a31d6a7c.gif](https://i-blog.csdnimg.cn/blog_migrate/0faff2a2ab76b513b736ae9d6908dc01.gif)
![6853669ebab5f274f1a87350fc013cd9.png](https://i-blog.csdnimg.cn/blog_migrate/9b98c76f4efbff18957b5a81d2855d0d.png)
02
element ui中el-tree的写法
![a9a58eda4acf5ffa3c7f0ebe8ebd4a03.png](https://i-blog.csdnimg.cn/blog_migrate/9766701d0896972933093e904c389b4c.png)
el-tree是element uI的中树形结构的写法,主要使用的场景是在需要父级和子级的情况下使用,下面看一下前台的写法。
![aed70f1f007d0733031a5df975e897f8.png](https://i-blog.csdnimg.cn/blog_migrate/de026df7f1988f7888f0b09d6294df49.png)
![2541d68770a5f13b6ddc27268e18e50e.png](https://i-blog.csdnimg.cn/blog_migrate/9a989c86cf50d3454b32dc8b6c3f8e63.png)
HTML的代码
:data="sysMenuTreeData" show-checkbox default-expand-all node-key="menuId" ref="tree" highlight-current :default-checked-keys='defaultExpandedKeys' :props="defaultProps" @node-click="handleNodeClick"></el-tree>
![4a1de2b86ff8619d5f785063e542bf4f.png](https://i-blog.csdnimg.cn/blog_migrate/5251edfb3b89668d1aac9c88a9252702.png)
JS的代码
request({ url:'/sys/SysMenu/geButtonTreeData', method: 'POST', data: {}}).then((res) => { debugger if (res.data != null) { this.sysMenuTreeData = res.data; } else { this.sysMenuTreeData = ""; }}).catch((response) => { this.sysMenuTreeData="";});
03
spring boot后台
![a9a58eda4acf5ffa3c7f0ebe8ebd4a03.png](https://i-blog.csdnimg.cn/blog_migrate/9766701d0896972933093e904c389b4c.png)
java后台递归构造树形结构,其实很简单,设计表结构的时候定义父级字段和子级字段,然后定义一个树形结构的实体,比如treeDto,建立实体的父子级关系。然后把数据按照父子级关系循环递归就可以了。
![aed70f1f007d0733031a5df975e897f8.png](https://i-blog.csdnimg.cn/blog_migrate/de026df7f1988f7888f0b09d6294df49.png)
![2541d68770a5f13b6ddc27268e18e50e.png](https://i-blog.csdnimg.cn/blog_migrate/9a989c86cf50d3454b32dc8b6c3f8e63.png)
首先定义一个实体dto
public class SysMenuTreeOutVo extends SysMenu { private String id; private String value; private String label; private List children; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public ListgetChildren() { return children; } public void setChildren(List children) { this.children = children; } public String getValue() { return value; } public void setValue(String value) { this.value = value; }
![2541d68770a5f13b6ddc27268e18e50e.png](https://i-blog.csdnimg.cn/blog_migrate/9a989c86cf50d3454b32dc8b6c3f8e63.png)
下面是controller的代码重点来了,循环递归数据
/** * 获取菜单数据 * @return */@RequestMapping(value = "/getMenuTree", method = {RequestMethod.GET, RequestMethod.POST})@ResponseBodypublic ResultInfo getSysRole() { List sysMenuList = this.sysMenuService.getSysMenuTree(); List resultList = new ArrayList(); // 把数据组织成树 SysMenu sysMenu = new SysMenu(); sysMenu.setMenuId(""); resultList = this.listToTree(sysMenu, sysMenuList); // 定义传参 ResultInfo result = new ResultInfo(); result.setData(resultList); return result;}/** * 构造树形菜单 * @param parmData 父级 * @param list 子级数据 * @return */private List listToTree(SysMenu parmData, Listlist) { List childData = new ArrayList(); for (SysMenuTreeOutVo data : list) { if ((parmData.getMenuId() == null && data.getParentId() == null) || data.getParentId() != null && data.getParentId().equals(parmData.getMenuId()) ) { childData.add(data); } } List resultList = new ArrayList(); for (SysMenuTreeOutVo item : childData) { item.setId(item.getMenuId()); item.setValue(item.getMenuId()); item.setLabel(item.getMenuName()); item.setChildren(this.listToTree(item, list)); resultList.add(item); } return resultList;}
总
结
java的树形递归结构基本上是这么实现,主要的内容在于后台给前台数据的整理,只要后台整理成前台需要的json数据,前台自动加载树形结构。后续我会分享更多的技术相关的内容,请大家多多关注。
![59631780b70928960f4d25105008f578.gif](https://i-blog.csdnimg.cn/blog_migrate/144b14b75489dfd1aafb2f4f811fe002.gif)
扫码关注我们
![fb1feca911f299ac487dfbbc1af0b62e.png](https://i-blog.csdnimg.cn/blog_migrate/bf3fa3e4c98f4f898abc80fb777c33b5.png)