dtree.js 树结构点击父节点异步加载子节点数据

由于此次项目开发框架使用layui,树结构自然想到了使用dtree,功能需求是选择省份下的企业,由于企业数据达到上万家,一次性将所有的数据加载出来会造成页面卡顿,由此想到先加载行政区划再根据点击事件获取企业数据:
解决思路:
① 、先使用dtree.render() 封装行政区划树结构,此处要注意树结构数据格式,dtree官网提供快速使用方法
②、参考官网提供右键选择工具栏(toolbarFun)对节点进行增删改查的方法,对源码稍作提炼异步加载子节点

一、参考文档示例:
1、初始化树结构, 由于功能需要使用复选框,故参考lis集合数据结构,返回结果一定要有checkArr,不然复选框无法生成。

在这里插入图片描述
2、异步加载子节点

在这里插入图片描述
3、使用方法注意点

在这里插入图片描述

二、具体实现方法如下:

 var regionEnpTree = getRegionEnpTree(dtree, 'regionEnpTree');//获取行政区划调用方法
//    var param = dtree.getCheckbarNodesParam("regionEnpTree");  // 获取选中数据
/**
 * 获取行政区划树结构,点击子级获取企业
 * dtree 模块名称
 * treeId 组件容器id
 * initRegionCode 初始化行政区划选中值(编辑页面回显赋值时传值,无默认选中值可不填)
 * initEnpCode 初始化企业选中值(编辑页面回显赋值时传值,无默认选中值可不填)
 **/
function getRegionEnpTree(dtree, treeId, initRegionCode, initEnpCode) {
    var regionEnpTree = null;
    $.get('行政区划树结构接口地址', {}, function(initData){
        if (initData.data && initData.data.length>0) {
        //此处循环是因为后台返回接口无法添加checkArr字段,故前端循环封装处理,若后台返回有checkArr字段,此段代码可不要
            $.each(initData.data,function (index,value) {
                value.checkArr = [{"type": "0", "checked": "0"}];
                value.parentId = -1;
                $.each(value.children,function (a,b) {
                    b.checkArr = [{"type": "0", "checked": "0"}];
                    $.each(b.children,function (x,y) {
                        y.checkArr = [{"type": "0", "checked": "0"}];
                    })
                })
            });
            regionEnpTree = dtree.render({
                elem: "#"+treeId,
                data: initData.data,
                method:'GET',
                url:'/getEnpByReg', //根据行政区划节点获取企业数据接口,需调用自己服务器地址
                width:470, //容器宽度
                dataStyle: "layuiStyle",  //使用layui风格的数据格式
                menubar: false, //开启菜单栏
                checkbar:true, //开启复选框
                record:true, //开启添加额外参数
                done: function (res, $ul, first) {
                    //点击非该元素操作区域隐藏弹出层
                    $(document).click(function(event){
                        var _con = $("input[dtree-id="+treeId+"]");
                        if(!_con.is(event.target) && _con.has(event.target).length === 0){
                            $('.layui-card.dtree-select').removeClass('dtree-select-show');
                        }
                    });
                    if(initRegionCode){
                        dtree.dataInit(treeId, initRegionCode); //初始化赋值
                        dtree.selectVal(treeId, initRegionCode); //初始化选中值
                    }
                }
            });

            dtree.on("node("+treeId+")" ,function(obj){ //点击节点事件
                if(obj.param.leaf){
                    var $div = obj.dom, $ul = $div.next("ul");
                    regionEnpTree.url = '/getEnpByReg'; //参考源码给regionEnpTree的url添加接口地址,需调用自己服务器地址,可在控制台输入regionEnpTree查看具体返回结果
                    $.get('/getEnpByReg', {nodeId:obj.param.nodeId},  function (jsonData) { //此处需注意,参数名必须为nodeId
                        if(jsonData.data && jsonData.data.length > 0){
                            var nodeJson = []; //动态构造字节点数据结构
                            $.each(jsonData.data,function (x,y) {
                                regionEnpTree.temp = [y.code, $ul, $div, Number(obj.param.level)+1];
                                nodeJson.push({
                                    checkArr: [],
                                    children: [],
                                    iconClass: null,
                                    id: y.code,
                                    isLast: true,
                                    parentId: obj.param.nodeId,
                                    title: y.name
                                });
                            });
                            regionEnpTree.toolbarFun.addTreeNode(nodeJson,$div); // 调用toolbarFun 的addTreeNode方法异步加载数据
                            regionEnpTree.changeTreeNodeAdd("refresh") ;//重新渲染子节点
                        }
                    })
                }
            });
        }
    });
    return regionEnpTree
}

三、接口返回结果及效果参考
1、行政区划接口返回结果
在这里插入图片描述
2、企业节点接口返回结果
在这里插入图片描述

3、效果
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
layui.dtree.render()是layui中树形组件dtree的渲染方法,可以将数据渲染成一颗树形结构。 使用方法: 1. 引入dtree.js文件和dtree.css文件 2. 定义一个容器,用于渲染树形结构 ```html <div id="tree"></div> ``` 3. 构造树形数据 ```javascript var treeData = [ { title: '节点1', id: '1', children: [ { title: '节点1.1', id: '1-1' }, { title: '节点1.2', id: '1-2' } ] }, { title: '节点2', id: '2', children: [ { title: '节点2.1', id: '2-1' }, { title: '节点2.2', id: '2-2' } ] } ]; ``` 4. 调用layui.dtree.render()方法渲染树形结构 ```javascript layui.use(['dtree'], function() { var dtree = layui.dtree; dtree.render({ elem: '#tree', // 容器ID data: treeData, // 数据 checkbar: true // 是否开启复选框 }); }); ``` 常用参数: elem:容器ID,必填项。 data:树形数据,必填项。 checkbar:是否开启复选框。 toolbar:是否开启工具栏。 initLevel:树形展开的层数。 url:异步加载数据的URL。 response:异步加载数据的返回值。 方法: - layui.dtree.reload(elem, data):重新加载树形结构。 - layui.dtree.setCheckbarNodes(elem, checked):设置复选框选中状态。 - layui.dtree.getCheckbarNodesParm(elem):获取复选框选中的节点ID数组。 - layui.dtree.getNodeParam(elem, nodeid):获取指定节点的参数。 - layui.dtree.getNowParam(elem):获取当前选中的节点参数。 - layui.dtree.getParentNodeParam(elem, nodeid):获取指定节点的父节点参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值