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.4 组件源码

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

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:

image

2.7.截图

 树形表格1:

树形表格1

 树形表格2:

树形表格2
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,111评论 1 45
  • 最好的爱情是什么模样,大概就是这般模样,相濡以沫的时间长河里,我们相互陪伴,慢慢变老,等走不动了可以相互搀扶,相互...
    宛小风阅读 345评论 4 7
  • 我有一个朋友叫宁七,宁七有一个朋友叫管华,宁七与管华相识有十年之久,革命友谊纯洁的光芒万丈,一男一女都未谈婚...
    菠萝理想阅读 1,034评论 22 32