0、学完本文你或许可以收获 感受一个树工具从初始逐步优化完善的过程 树工具封装的设计思考与实现思路 最后收获一款拿来即用的树工具源代码 对于前端树组件有一定了解和使用过的同学可直接跳。..
0、学完本文你或许可以收获
感受一个树工具从初始逐步优化完善的过程
树工具封装的设计思考与实现思路
最后收获一款拿来即用的树工具源代码
对于前端树组件有一定了解和使用过的同学可直接跳跃到第3章节开始。
1、树长什么样
前端的树组件大多数情况下出现在后端的管理系统中,比如我们常见的菜单树、机构树、某某分类树、树表格等。大致像下方图片所展示的这样。
菜单树
机构树
org_tree.png
树表格
大致上来说,前端树的展现形式就是上面3张图所列的几种形式。而这种前端树组件的展现构成需要依赖于后端返回的数据格式。
2、数据格式
结合我自身使用过的前端树组件来说,大致可以分为如下两种。
列表形式
1 | [ |
1 | // 2、MenuEntity -> TreeNode |
}
1 | // 3、树结构构建 |
}
1 | 收工,第一版简单的树工具就实现了。 |
}
}
}
1 | 如此一来,我们就可以支持任意类型的树构造。 |
1 | private TreeNodeConfig treeNodeConfig; |
1 | public TreeNodeMap(){ |
}
1 | public TreeNodeMap(TreeNodeConfig treeNodeConfig){ |
}
1 | public <T> T getId() { |
}
1 | public void setId(String id) { |
}
1 | public <T> T getParentId() { |
}
1 | public void setParentId(String parentId) { |
}
1 | public <T> T getName() { |
}
1 | public void setName(String name) { |
}
1 | public <T> T getCode() { |
}
1 | public TreeNodeMap setCode(String code) { |
}
1 | public List<TreeNodeMap> getChildren() { |
}
1 | public void setChildren(List<TreeNodeMap> children) { |
}
1 | public void extra(String key,Object value){ |
}
`2 既然支持属性名自定义,新增配置类TreeNodeConfig来完成这个事情,同时提供默认属性名```java
1 | public class TreeNodeConfig { |
1 | // 默认属性的单例对象 |
1 | // 树节点默认属性常量 |
1 | // 属性 |
1 | public String getIdKey() { |
}
1 | public void setIdKey(String idKey) { |
}
1 | public String getCodeKey() { |
}
1 | public void setCodeKey(String codeKey) { |
}
1 | public String getNameKey() { |
}
1 | public void setNameKey(String nameKey) { |
}
1 | public String getChildrenKey() { |
}
1 | public void setChildrenKey(String childrenKey) { |
}
1 | public String getParentIdKey() { |
}
1 | public void setParentIdKey(String parentIdKey) { |
}
1 | public String getOrDefault(String key,String defaultKey){ |
}
1 | return key; |
}
1 | public static TreeNodeConfig getDefaultConfig(){ |
}
}
3 最后,改造TreeUtil.build 方法,基于2.0版本,只需将TreeNode替换成TreeNodeMap即可。
/**
* 树构建
*/
public static <T> List<TreeNodeMap> build(List<T> list,Object parentId,Convert<T,TreeNodeMap> convert){
List<TreeNodeMap> treeNodes = CollectionUtil.newArrayList();
TreeNodeMap treeNode = new TreeNodeMap();
}
List<TreeNodeMap> finalTreeNodes = CollectionUtil.newArrayList();
for(TreeNodeMap treeNode : treeNodes){
}
}
// ... 省略菜单模拟数据的创建过程
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定义属性名
treeNodeConfig.setCodeKey("number");
List<TreeNodeMap> treeNodes = TreeUtil_4_0.build(menuEntityList, "0",treeNodeConfig,new TreeUtil_4_0.Convert<MenuEntity, TreeNodeMap>() {
public void convert(MenuEntity object, TreeNodeMap treeNode) {
// 属性扩
treeNode.extra("extra1","123");
}
});
Console.log(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(treeNodes)));
}
经过上面的改造,我们实现了树节点属性的自定义,顺便还实现了属性可扩展,一举两得。
3、总结
目前这个程度可能仍有些场景无法满足,但是对于大部分的问题场景基于3.0或4.0版本稍加改造应该都可以解决。剩下的就结合场景再酌情优化调整。
4、源代码&视频
源代码: springboot-tree
视 频: 实现讲解
5、更多精彩
觉得还行,动动手指留个赞。
以上就是今天的内容,我们下期见。
本文标题: 突破CRUD万能树工具
发布时间: 2019年06月01日 00:00
最后更新: 2025年12月30日 08:54
原始链接: https://haoxiang.eu.org/efeeda21/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

