LayUi框架中树形组件tree官方还在持续完善中,目前最新版本为v2.5.5
官方树形组件目前还不支持懒加载方式,我自己修改了下最新源码tree.js,简单粗暴的方式支持懒加载模式。(Ps:最新更新-9-23 09:59:00)
我的解决方案如下:
1、官方树形组件,默认当子节点无数据时不显示展开图标和操作,这里通过注释以下代码,子节点children:[]spread:false 时,显示+号,可以点击展开动作。
2、封装spread事件,当展开时触发回调,返回参数中包含data:当前节点数据,state:值为false子节点无数据,elem:当前节点元素,下面代码修改中,发现原有变量a冲突,所以替换为aa。(已修复手风琴模式下子节点无法隐藏问题)
3、上面修改后展开操作事件有了,下一步就是怎么样去充填子节点数据?我这里最终的方案是利用tree.reload(id,data)方法,将本地数据中找到当前索引节点位置,
通过懒加载方式获取子节点数据充填原有数据当中,最终调用reload方法重载组件。(更新递归所有子节点,计算当前所有节点展开状态)
说明:function (e, i, d) 参数e为 tree实例唯一索引id;参数i=obj.data.id 当前展开节点id;参数d为异步获取的子节点数据[]。
调用例子:
layui.use('tree', function () {var tree = layui.tree;//渲染var inst1 = tree.render({elem: '#treelist', id: 'treelist', showCheckbox: !1 //复选框, showLine: !0 //连接线, accordion: !1 //手风琴模式, onlyIconControl: !1 //左侧图标控制展开收缩, isJump: !1 //弹出新窗口跳转, edit: !1 //开启节点的操作 , data: [{id: '144115188075855872', title: '哈尔滨市第三中学', spread: true, children: [{id: '144396663052566528', title: '级学生', children: [{id: '144397762564194304', title: '级一班'}, {id: '144398862075822080', title: '级二班'}, {id: '144399961587449856', title: '级三班'}]}]}, {id: '144678138029277184', title: '教职工', spread: false, children: []}], text: {defaultNodeName: '无数据', none: '加载数据失败!'}, click: function (obj) {console.log(obj.data); //得到当前点击的节点数据// console.log(obj.state); //得到当前节点的展开状态:open、close、normal// console.log(obj.elem); //得到当前节点元素// console.log(obj.data.children); //当前节点下是否有子节点 }, oncheck: function (obj) {console.log(obj.data); //得到当前点击的节点数据console.log(obj.checked); //得到当前节点的展开状态:open、close、normalconsole.log(obj.elem); //得到当前节点元素 }, spread: function (obj) {if (!obj.state) {// 懒加载子节点,异步获取data数据 这里根据obj.data.id像后台请求当前节点数据// 这里模拟3层用IF判断来测试,实际不需要if (obj.data.id === '144678138029277184') { //第二层节点数据 tree.children(inst1.config.id, obj.data.id, [{id: '101', title: '子节点1'}, {id: '102', title: '子节点2', spread: false, children: []}]);}if(obj.data.id === '102'){ //第三层节点数据 tree.children(inst1.config.id, obj.data.id, [{id: '10201', title: '子节点3'}, {id: '10202', title: '子节点4', spread: false, children: []}]);}if(obj.data.id === '10202'){ //第四层节点数据 tree.children(inst1.config.id, obj.data.id, [{id: '101', title: '子节点5'}, {id: '102', title: '子节点6'}]);}}// console.log(obj.data);// console.log(obj.state);// console.log(obj.elem); }});});
tree.js 下载地址在回复区可见。(layui-v2.5.5版本替换tree.js可用)