LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据

LayUi框架中树形组件tree官方还在持续完善中,目前最新版本为v2.5.5

官方树形组件目前还不支持懒加载方式,我自己修改了下最新源码tree.js,简单粗暴的方式支持懒加载模式。

我的解决方案如下:

1、官方树形组件,默认当子节点无数据时不显示展开图标和操作,这里通过注释以下代码,子节点children: []  spread: false 时,显示+号,可以点击展开动作。

LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据_第1张图片

 

 2、封装spread事件,当展开时触发回调,返回参数中包含data:当前节点数据,state:值为false子节点无数据,elem:当前节点元素,下面代码修改中,发现原有变量a冲突,所以替换为aa。

LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据_第2张图片

 

3、上面修改后展开操作事件有了,下一步就是怎么样去充填子节点数据?我这里最终的方案是利用tree.reload(id,data)方法,将本地数据中找到当前索引节点位置,

通过懒加载方式获取子节点数据充填原有数据当中,最终调用reload方法重载组件。(更新递归所有子节点,计算当前所有节点展开状态)

LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据_第3张图片

 

 LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据_第4张图片

说明: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: '2016级学生'
                    , children: [{
                        id: '144397762564194304'
                        , title: '2016级一班'
                    }, {
                        id: '144398862075822080'
                        , title: '2016级二班'
                    }, {
                        id: '144399961587449856'
                        , title: '2016级三班'
                    }]
                }]
            }, {
                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、normal
                console.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: '1020201'
                            , title: '子节点5'
                        }, {
                            id: '1020202'
                            , title: '子节点6'
                        }]);
                    }
                }
                // console.log(obj.data);
                // console.log(obj.state);
                // console.log(obj.elem);
            }
        });
    });

 

LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据_第5张图片

 

 官方手风琴模式下图标显示有BUG

 

tree.js 下载地址在回复区可见。(layui-v2.5.5版本替换tree.js可用)

 

你可能感兴趣的:(LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据)