目录
概述
1. 使用说明
2. 使用需知
2.1 本组件依赖于 treetable.JS[重中之重]
2.2 本组件基于 layUIAdmin 进行使用
2.3 本组件的方法支持 treetable.JS 的所有方法;
2.4 本组件不支持的其他方法, 均可使用 layui-table 组件的方法.
2.4 组件源码
[附] 非异步加载的 treetable.JS 使用方式
1. 简介
2. 使用方法
2.1. 引入模块
2.2. 渲染表格
2.3. 参数说明
2.4. 注意事项
2.5. 其他方法
2.6. 如何修改图标
2.7. 截图
概述
后台框架中使用树状表格是非常常用的操作, 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 数据表格之上进行扩展实现.
演示地址: https://whvse.gitee.io/treetable-lay/
还有一个 BOM 表结构的树形表格, 树形表格 2 https://gitee.com/whvse/treetable , 欢迎查看.
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');
全部折叠
JavaScript 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:
树形表格 2:
来源: https://www.cnblogs.com/qdjianghao/p/10213300.html