一、说明
当有一个树形结构的数据有非常多个节点的时候,一次性加载所有节点会显得过于臃肿,可能会对性能造成影响,正好Ant Design 的树(Tree)组件支持异步加载,于是我就想把异步加载封装为一个组件,可以减少接口数据返回,点击展开节点,动态加载数据。非常好用!
二、前端实现
需要接收一些值用来数据的初始化和格式化
const props = defineProps({
//替换treeNode 中 children
fieldNamesChildren: { type: String, default: 'children' },
//替换treeNode 中 title
fieldNamesTitle: { type: String, default: 'title' },
//替换treeNode 中 key
fieldNamesKey: { type: String, default: 'id' },
//初始数据
treeData: { type: Function, required: true },
//父Id字段
parentIdColumn: { type: String, default: 'parentId' },
//默认顶级父Id值
topValue: { default: 0 }
})
以组织树为例,需要异步加载的时候,由tree
组件换成lazyTree
组件就行
默认需要传treeData属性,也就是去请求后端去获取数据的方法,这个方法需要有一个参数parameter,当展开节点的时候会请求这个方法并带上父ID去查询。
首次加载组件会调用一次获取节点数据方法。
点击某个节点会根据节点的key对应的字段,获取下级节点。并添加到节点数据中。
三、后端实现
以组织树为例,原来的tree方法需要增加父ID
参数来根据父ID获取下级节点
原来的tree方法也要改一改,如果选择器ID不为空则表示是懒加载,只加载子节点。
GetSysOrgChildenLazy方法会去根据父ID找到对应的子节点并判断子节点是否有下级节点。
需要在组织实体中加个IsLeaf
字段判断是不是叶子节点,如果IsLeaf
是true就表示没有子节点了,前端树控件也不会显示小箭头。
四、效果
最后实现效果如下,这里一次请求加载2级节点。