zoukankan      html  css  js  c++  java
  • layUI之树状表格异步加载组件treetableAsync.js(基于treetable.js)

    概述

    后台框架中使用树状表格是非常常用的操作,layUI本身并没有这种组件。 第三方的treetable.js做到了完美的实现,但是不能实现在双击时异步加载数据,本文就是站在了巨人的肩膀上实现的异步加载的树状表格~

    1. 使用说明

      本组件基于treetable.js组件进行编写,最大的区别在treetable.js无法进行异步加载,而本组件则使用异步加载树状表格。
      因此,若无异步加载需求,建议直接使用treetable.js,有异步加载需求时,可使用本组件。
      本组件treetableAsync.js下载地址:https://pan.baidu.com/s/1qZXi7mLJj0ZvjMd4mGbjFA 提取码:808p
      本组件所依赖的treetable.js下载地址:https://pan.baidu.com/s/1fx5_sFRb0Noa4NCIdDoltw 密码:e891 (源码有修改,因此不能使用官方下载的原版本)

    2. 使用需知

    2.1 本组件依赖于treetable.js【重中之重】

      由于本组件依赖于treetable.js,因此使用本组件时,需首先引入treetable.js,方可使用。 但由于treetable.js的源码进行过修改,因此不能使用官方下载的原版本。
      代码示例:

    layui.config({
        base: '../../common/'
    }).extend({
    	index: 'lib/index',
        treetable: "../lib/extend/treetable", // 使用异步加载treetableAsync,必须先引入treetable
        treetableAsync : '../lib/extend/treetableAsync'
    })
    

    2.2 本组件基于layUIAdmin进行使用

      本组件使用中的Ajax请求,基于layUIAdmin的admin.req()进行。 如果不使用layUIAdmin,需要自行调整源码。

    2.3 本组件的方法支持treetable.js的所有方法;

      本组件中所用的所有方法,均基于支持treetable.js中所使用的方法,因此在treetable.js中可以调用的方法,均可使用treetableAsync调用。
      例如:

    treetableAsync.expandAll('#dataList');
    // 等同于
    treetable.expandAll('#dataList');
    

    2.4 本组件不支持的其他方法,均可使用layui-table组件的方法。

      本组件及treetable.js所不支持的方法,均可使用layUI原生的数据表格组件的相应方法。
      本组件不支持列表的toolbar操作,则可以使用table原生的事件监听:

    //列表操作
    table.on('tool(dataList)', function (obj) {
    })
    

    2.5 组件源码

      本组件源码附上,大家有疑问可以评论留言。

    layui.define(['index','form','treetable','jquery','treetable'],function(exports){
        var treetable = layui.treetable,
            table = layui.table,
            form = layui.form,
    	    $ = layui.jquery,
    	    setter = layui.setter,
            view = layui.view,
        	admin = layui.admin;
        	
        var tableData = [];
        
        var treetableAsync = {
        	render : function(param){
        		var provincesUrl = param.url;
    	
    			function init(id){
    				admin.req({
    					url: provincesUrl + id,
    					type:"get",
    					success:function(r){
    						param.data = tableData = r.data;
    						tableInit();
    					}
    				});
    			}
    			init(param.treeSpid);
    			
    			// 渲染表格
    		    function tableInit(){
    		    	treetable.render(param);
    		    }
    			
    			$("body").on('dblclick','.layui-table-body .layui-table tr',function(){
    				var top = $('.layui-table-body').scrollTop();
    				var pid = $(this).find('div[class$="'+param.treeIdName+'"]').text();
    				var index = $(this).index();
    				admin.req({
    					url: provincesUrl + pid,
    					type:"get",
    					success:function(r){
    						var isInit = false;
    						for(var i=0; i<r.data.length; i++){
    							var isPush = true;
    							for(var j=0; j<tableData.length; j++){
    								if(r.data[i][param.treeIdName] == tableData[j][param.treeIdName]){
    									isPush = false;
    								}
    							}
    							if(isPush){
    								tableData.push(r.data[i]);
    								isInit = true;
    							}
    						}
    						if(isInit){
    							param.data = tableData;
    							tableInit();
    							expandSelfAndParent(index);
    							$('.layui-table-body').scrollTop(top);
    						}
    					}
    				});
    			});
    			
    			
    			function expandSelfAndParent(index){
    				treetable.toggleRows($('.layui-table-body .layui-table tr').eq(index).find('.treeTable-icon'));
    				var tpid = $('.layui-table-body .layui-table tr').eq(index).find('.treeTable-icon').attr('lay-tpid');
    				var trs = $('.layui-table-body .layui-table tr');
    				var j = -1;
    				for(var i=0; i<trs.length; i++){
    					if($(trs[i]).find('.treeTable-icon').attr('lay-tid') == tpid){
    						treetable.toggleRows($('.layui-table-body .layui-table tr').eq(i).find('.treeTable-icon'));
    						if($(trs[i]).find('.treeTable-icon').attr('lay-tpid') != 0){
    							j=i
    						}
    						break;
    					}
    				}
    				if(j != -1){
    					init(j)
    				}
    			}
    			
        	},
        	
        	toggleRows:function($dom, linkage){
        		treetable.toggleRows($dom, linkage);
        	},
        	getEmptyNum:function(pid, data){
        		treetable.getEmptyNum(pid, data);
        	},
        	checkParam:function(param){
        		treetable.checkParam(param);
        	},
        	expandAll:function(dom){
        		treetable.expandAll(dom);
        	},
        	foldAll:function(dom){
        		treetable.foldAll(dom);
        	}
        }
        
        
        exports('treetableAsync', treetableAsync);
    
    })
    

    **  除此之外,本组件所有方法属性,均与treetable.js完全相同,请熟读treetable.js的帮助文档。**

    【附】 非异步加载的treetable.js使用方式

     实现layui的树形表格treeTable

    1.简介

     在layui数据表格之上进行扩展实现。

     还有一个BOM表结构的树形表格,树形表格2,欢迎查看。

    2.使用方法

    2.1.引入模块

     下载module/treetable-lay整个文件夹,放在你的项目里面,然后使用模块加载的方式使用:

    layui.config({
        base: 'module/'
    }).extend({
        treetable: 'treetable-lay/treetable'
    }).use(['treetable'], function () {
        var treetable = layui.treetable;
        
    });
    

    2.2.渲染表格

    <table id="table1" class="layui-table" lay-filter="table1"></table>
    
    <script>
    layui.use(['treetable'], function () {
        var treetable = layui.treetable;
        
        // 渲染表格
        treetable.render({
            treeColIndex: 2,          // treetable新增参数
            treeSpid: -1,             // treetable新增参数
            treeIdName: 'd_id',       // treetable新增参数
            treePidName: 'd_pid',     // treetable新增参数
            treeDefaultClose: true,   // treetable新增参数
            treeLinkage: true,        // treetable新增参数
            elem: '#table1',
            url: 'json/data1.json',
            cols: [[
                {type: 'numbers'},
                {field: 'id', title: 'id'},
                {field: 'name', title: 'name'},
                {field: 'sex', title: 'sex'},
                {field: 'pid', title: 'pid'},
            ]]
        });
    });
    </script>
    
    

    注意:

      可以使用url传递数据,也可以使用data传递数据,如果使用url传递数据,参数是where字段,
    跟layui数据表格的使用方式一致。


    数据格式

      总而言之就是以id、pid的形式,不是以subMenus的形式,当然id、pid这两个字段的名称可以自定义:

    {
      "code": 0,
      "msg": "ok",
      "data": [{
          "id": 1,
          "name": "xx",
          "sex": "male",
          "pid": -1
        },{
          "id": 2,
          "name": "xx",
          "sex": "male",
          "pid": 1
        }
      ]
    }
    

    2.3.参数说明

     layui数据表格的所有参数都可以用,除此之外treetable新增的参数有:

    参数 类型 是否必填 描述
    treeColIndex int 树形图标显示在第几列
    treeSpid object 最上级的父级id
    treeIdName string id字段的名称
    treePidName string pid字段的名称
    treeDefaultClose boolean 是否默认折叠
    treeLinkage boolean 父级展开时是否自动展开所有子级

    treeColIndex

     树形图标(箭头和文件夹、文件的图标)显示在第几列, 索引值是cols数组的下标。

    treeSpid

     最上级的父级id,比如你可以规定pid为0或-1的是最顶级的目录。

    treeIdName

     treetable是以id和pid字段来渲染树形结构的,如果你的数据没有id和pid字段,你可以指定id和pid字段的名称。

    treePidName

     pid在你的数据字段中的名称。

    treeDefaultClose

     默认是全部展开的,如果需要默认全部关闭,加上treeDefaultClose:true即可。

    treeLinkage

     父级展开时是否自动展开所有子级

    2.4.注意事项

    • 不能使用分页功能,即使写了page:true,也会忽略该参数。

    • 不能使用排序功能,不要开启排序功能。

    • table.reload()不能实现刷新,请参考demo的刷新。

    • 除了文档上写的treetable.xxx的方法之外,其他数据表格的方法都使用table.xxx。

    • 建议删除和修改请求完后台之后请刷新(重新渲染)表格,最好不要使用obj.delete方式删除。

    2.5.其他方法

    全部展开

    treetable.expandAll('#table1');
    

    全部折叠

    treetable.foldAll('#table1');
    

    2.6.如何修改图标

      通过css来修改图标,content是图标的unicode字符。

    修改文件夹图标:

    /** 未展开 */
    .treeTable-icon .layui-icon-layer:before {
        content: "e638";
    }
    
    /** 展开 */
    .treeTable-icon.open .layui-icon-layer:before {
        content: "e638";
    }
    

    修改文件图标:

    .treeTable-icon .layui-icon-file:before {
        content: "e621";
    }
    

    修改箭头的图标:

    /** 未展开 */
    .treeTable-icon .layui-icon-triangle-d:before {
        content: "e623";
    }
    
    /** 展开 */
    .treeTable-icon.open .layui-icon-triangle-d:before {
        content: "e625";
    }
    

    如何获取content:

    2.7.截图

     树形表格1:

    树形表格1

     树形表格2:

    树形表格2

    【本文作者】@小风飞鱼
    【原文出处】http://www.cnblogs.com/qdjianghao/
    【版权声明】本文版权归原作者@小风飞鱼所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    【联系方式】1987289469
  • 相关阅读:
    数列分块入门九题(一):LOJ6277~6279
    Luogu P4211 [LNOI2014]LCA
    Luogu P2279 [HNOI2003]消防局的设立
    Luogu P3177 [HAOI2015]树上染色
    51Nod 1677 treecnt
    CYJian的水题大赛
    51Nod 1299 监狱逃离
    51Nod 1705 七星剑
    51Nod 1443 路径和树
    51Nod 1815 调查任务
  • 原文地址:https://www.cnblogs.com/qdjianghao/p/10213300.html
Copyright © 2011-2022 走看看