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閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 27,552評論 1 45
  • 最好的愛情是什么模樣,大概就是這般模樣,相濡以沫的時間長河里,我們相互陪伴,慢慢變老,等走不動了可以相互攙扶,相互...
    宛小風閱讀 372評論 4 7
  • 我有一個朋友叫寧七,寧七有一個朋友叫管華,寧七與管華相識有十年之久,革命友誼純潔的光芒萬丈,一男一女都未談婚...
    菠蘿理想閱讀 1,082評論 22 32