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

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

官方树形组件目前还不支持懒加载方式,我本身修改了下最新源码tree.js,简单粗暴的方式支持懒加载模式。(Ps:最新更新2019-11-4 14:22:35)异步

个人解决方案以下:测试

一、官方树形组件,默认当子节点无数据时不显示展开图标和操做,这里经过注释如下代码,子节点children: []  spread: false 时,显示+号,能够点击展开动做。ui

 

 二、封装spread事件,当展开时触发回调,返回参数中包含data:当前节点数据,state:值为false子节点无数据,elem:当前节点元素,下面代码修改中,发现原有变量a冲突,因此替换为aa。(已修复手风琴模式下子节点没法隐藏问题)spa

 

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

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

 

 

说明:function (e, i, d) 参数e为 tree实例惟一索引id;参数i=obj.data.id 当前展开节点id;参数d为异步获取的子节点数据[]。orm

调用例子:blog

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);
            }
        });
    });

 

 

 

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

相关文章
相关标签/搜索