企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 7.1.树形表格 :id=treeTable treeTable树形表格已进行了重写,模块名是treeTable,旧版模块名是treetable,不要搞混了, [查看演示](https://whvse.gitee.io/treetable-lay/demo2x/index.html)。 ## 7.1.1.快速使用 :id=start 方法渲染: ```html <table id="demoTb1"></table> <script> layui.use(['treeTable'], function () { var $ = layui.jquery; var treeTable = layui.treeTable; var data = [{ id: '1', name: 'xxx', createTime: '2019/11/18 10:44:00', children: [ { id: '1_1', name: 'xxx', createTime: '2019/11/18 10:44:00' }] }, { id: '2', name: 'xxx', createTime: '2019/11/18 10:44:00', children: [{ id: '2_1', name: 'xxx', state: 0, createTime: '2019/11/18 10:44:00', children: [] }] }]; // 渲染表格 var insTb = treeTable.render({ elem: '#demoTb1', data: data, // 数据 tree: { iconIndex: 1 // 折叠图标显示在第几列 }, cols: [ {type: 'numbers'}, {field: 'id', title: 'ID'}, {field: 'name', title: 'name', width: 160}, {field: 'createTime', title: '创建时间', width: 180} ] }); }); </script> ``` 使用pid形式的数据: ```javascript var data = [{ id: '1', name: 'xxx', createTime: '2019/11/18 10:44:00', }, { pid: '1', id: '1_1', name: 'xxx', createTime: '2019/11/18 10:44:00' },{ id: '2', name: 'xxx', createTime: '2019/11/18 10:44:00', },{ pid: '2', id: '2_1', name: 'xxx', state: 0, createTime: '2019/11/18 10:44:00', children: [] }]; // 渲染表格 var insTb = treeTable.render({ elem: '#demoTb1', data: data, // 数据 tree: { iconIndex: 1, // 折叠图标显示在第几列 isPidData: true // 是否是pid形式数据 }, cols: [ {type: 'numbers'}, {field: 'id', title: 'ID'}, {field: 'name', title: 'name', width: 160}, {field: 'createTime', title: '创建时间', width: 180} ] }); ``` 请求网络数据、懒加载: ```javascript var insTb = treeTable.render({ elem: '#demoTb1', tree: { iconIndex: 1, // 折叠图标显示在第几列 idName: 'id', // 自定义id字段的名称 pidName: 'pid', // 自定义标识是否还有子节点的字段名称 haveChildName: 'haveChild', // 自定义标识是否还有子节点的字段名称 isPidData: true // 是否是pid形式数据 }, cols: [ {type: 'numbers'}, {field: 'id', title: 'ID'}, {field: 'name', title: 'name', width: 160}, {field: 'createTime', title: '创建时间', width: 180} ], reqData: function(data, callback) { // 在这里写ajax请求,通过callback方法回调数据 $.get('list.json', function (res) { callback(res.data); // 参数是数组类型 }); } }); ``` !> 用法大部分与数据表格table模块一致,需要注意:cols是一维数组,不是二维数组。 ## 7.1.2.基础参数一览表 :id=options 参数 | 类型 | 说明 | 示例值 :--- | :--- | :--- | :--- elem | String/DOM | 指定原始 table 容器的选择器或 DOM | '#demo' cols | Array | 设置表头。值是一维数组 | 详见表头参数 data | Array | 直接赋值数据 | [{}, {}, {}, {}, …] width | Number | 设定容器宽度 | 350 height | Number/String | 设定容器高度 | 300 / 'full-150' cellMinWidth | Number | 定义所有单元格的最小宽度 | 100 text | Object | 自定义文本,如空数据提示等 | 详见自定义文本 skin | String | 设定表格风格 | line行边框、row列边框、nob无边框 even | Boolean | 开启隔行背景| true/false size | String | 设定表格尺寸 | sm 小尺寸、lg 大尺寸 tree | Object | 设定树相关参数 | 详见树相关参数 style | String | 设定容器的样式 | 'margin-top: 0;' getThead | Function | 自定义表头 | 详见自定义表头 reqData | Function | 懒加载数据 | 详见懒加载数据 ## 7.1.3.表头参数一览表cols :id=cols 参数 | 类型 | 说明 | 示例值 :--- | :--- | :--- | :--- field | String | 设定字段名 | 'username' title | String | 设定标题名称 | 用户名 width | Number | 设定列宽,若不填写,则自动分配 | 150 minWidth | Number | 单元格的最小宽度 | 100 type | String | 设定列类型 | checkbox复选框、radio单选框、numbers序号列、space空列 edit | String | 单元格编辑类型 | text(输入框) style | String | 自定义单元格样式| color: red; align | String | 单元格排列方式 | center居中、right居右 templet | String | 自定义列模板 | 详见自定义列模板 toolbar | String | 绑定工具条模板 | 详见行工具事件 > templet和toolbar用法与数据表格table模块一致 ## 7.1.4.树相关参数一览表tree :id=tree 参数 | 类型 | 说明 | 示例值 :--- | :--- | :--- | :--- iconIndex | Number | 图标列的索引 | 默认0 onlyIconControl | Boolean | 仅允许点击图标折叠 | 默认false arrowType | String | 箭头类型 | 可选'arrow2' getIcon | Function | 自定义树形图标 | 详见自定义树形图标 isPidData | Boolean | 是否是pid形式的数据,懒加载方式不需要 | 默认false idName | String | 设定id的字段名 | 默认'id' pidName | String | 设定pid的字段名,children形式数据不需要 | 默认'pid' childName | String | 设定children的字段名,pid形式数据不需要 | 默认'children' haveChildName | String | 设定是否有子集的字段名,用于懒加载 | 默认'haveChild' openName | String | 设定是否默认展开的字段名 | 默认'open' ## 7.1.5.自定义文本text :id=text 目前只支持自定义空数据提示: ```javascript treeTable.render({ text: { none: '<div style="padding: 15px 0;">哎呀,一条数据都没有~</div>' } }); ``` ## 7.1.6.自定义表头 :id=tb_head treeTable实现复杂表头的做法与table模块不同,方法如下: ```javascript treeTable.render({ getThead: function() { return '<tr><td colspan="6">我是表头</td></tr>'; } }); ``` 就是这么简单粗暴,直接返回表头的html即可,不用在cols里面纠结半天,所以treeTable的cols是一维数组。 ## 7.1.7.自定义树形图标 :id=tree_icon 内置了两种风格图标,你也可以很灵活的自己扩展风格: ```javascript treeTable.render({ tree: { arrowType: 'arrow2', // 自定义箭头风格 getIcon: function(d) { // 自定义图标 // d是当前行的数据 if (d.haveChild) { // 判断是否有子集 return '<i class="ew-tree-icon ew-tree-icon-folder"></i>'; } else { return '<i class="ew-tree-icon ew-tree-icon-file"></i>'; } } } }); ``` ew-tree-icon-folder(文件夹)和ew-tree-icon-file(文件)这两个class是treeTable内置的, 你可以换成其他clss自己加样式,ew-tree-icon这个class是必须的。 !> 判断是否有子集d.haveChild这个写法根据你的实际情况写,如果是children形式数据可以写(d.children&&d.children.length>0) ## 7.1.8.懒加载数据 :id=req_data 实现reqData参数即可实现懒加载数据: ```javascript treeTable.render({ elem: '#demoTable', reqData: function(data, callback) { // data是当前行的数据,通过callback回调子集数据 callback([]); }, tree: { iconIndex: 2, // 折叠图标显示在第几列 idName: 'id', // 自定义id字段的名称 haveChildName: 'haveChild' // 自定义标识是否还有子节点的字段名称 } }); ``` 你可以在reqData里面写ajax请求: ```javascript treeTable.render({ reqData: function(data, callback) { var pid = data?data.id:''; $.get('list.json?pid='+pid, function (res) { callback(res.data); }); } }); ``` json数据参考格式: ```json {"code": 200, "data": [{"id": "1", "name": "xxx", "haveChild": true}]} ``` 通过haveChild标识是否还有子节点,id也是必须的字段,这两个字段的名字可以在tree参数里面自定义。 !> reqData这个方法里面也可以一次性把所有数据都返回,也可以懒加载。 ## 7.1.9.默认展开 :id=open 通过在数据里面增加open字段来控制是否默认展开: ```javascript var data = [{ id: '1', name: 'xxx', open: true, // 默认展开 children: [ { id: '1_1', name: 'xxx', createTime: '2019/11/18 10:44:00' }] }, { id: '2', name: 'xxx', open: true, // 默认展开 children: [{ id: '2_1', name: 'xxx', state: 0, createTime: '2019/11/18 10:44:00', children: [] }] }]; ``` 字段名字也可以自定义: ```javascript treeTable.render({ tree: { openName: 'open', // 自定义默认展开的字段名 } }); ``` ## 7.1.10.事件监听 :id=event 监听工具条点击事件: ```javascript treeTable.on('tool(test)', function(obj){ var data = obj.data; // 获得当前行数据 var event = obj.event; // 获得lay-event对应的值 obj.del(); // 删除对应行,并更新缓存 // 同步更新缓存对应的值 obj.update({ username: '123', title: 'xxx' }); }); ``` 监听复选框选择: ```javascript treeTable.on('checkbox(test)', function(obj){ console.log(obj.checked); // 当前是否选中状态 console.log(obj.data); // 选中行的相关数据 console.log(obj.type); // 如果触发的是全选,则为:all,如果触发的是单选,则为:one }); ``` 监听单元格编辑: ```javascript treeTable.on('edit(test)', function(obj){ console.log(obj.value); //得到修改后的值 console.log(obj.field); //当前编辑的字段名 console.log(obj.data); //所在行的所有相关数据 }); ``` 监听行单双击事件: ```javascript // 监听行单击事件 treeTable.on('row(test)', function(obj){ console.log(obj.tr) //得到当前行元素对象 console.log(obj.data) //得到当前行数据 // obj.del(); // 删除当前行 // obj.update(fields) // 修改当前行数据 }); // 监听行双击事件 treeTable.on('rowDouble(test)', function(obj){ // obj 同上 }); ``` 监听单元格单双击事件: ```javascript // 监听行单击事件 treeTable.on('cell(test)', function(obj){ console.log(obj.field); //当前单元格的字段名 console.log(obj.data) // 得到当前行数据 }); // 监听行双击事件 treeTable.on('cellDouble(test)', function(obj){ // obj 同上 }); ``` ## 7.1.11.其他方法 :id=other ```javascript // pid形式数据转children形式数据 treeTable.pidToChildren(data, idName, pidName, childName); ``` ## 7.1.12.实例方法 :id=method ```javascript var insTb = treeTable.render({ }); // 刷新 insTb.reload(options); // 重载表格 insTb.refresh(); // 刷新(异步模式) insTb.refresh(id); // 刷新指定节点下的数据 insTb.refresh(id, data); // 刷新指定节点下的数据为data // 复选框 insTb.checkStatus(); // 获取选中数据 insTb.setChecked(['1','2']); // 设置选中数据 insTb.removeAllChecked(); // 移除全部选中 // 折叠/展开 insTb.expand(id); // 展开指定节点 insTb.fold(id); // 折叠指定节点 insTb.expandAll(); // 展开全部 insTb.foldAll(); // 折叠全部 // 搜索 insTb.filterData('keywords'); // 根据关键字模糊搜索 insTb.filterData(['1','2']); // 根据id搜索 insTb.clearFilter(); // 清除搜索 // 更新数据(只更新数据,不更新界面) insTb.del(id); // 根据id删除 insTb.update(id, fields); // 根据id更新 ```