目录
表格组件 table 是 Layui 中使用率极高的一个组件,它以表格的承载方式对数据进行渲染、重载、排序、统计、分页等等一系列交互操作,并提供了丰富的 API 用于扩展,基本涵盖了日常业务所涉及的大部分需求
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>table 组件综合演示 - Layuititle>
- <meta name="renderer" content="webkit">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link href="/cdn.staticfile.org/layui/2.8.0/css/layui.css" rel="stylesheet">
- head>
- <body>
- <div style="padding: 16px;">
- <table class="layui-hide" id="test" lay-filter="test">table>
- div>
- <script type="text/html" id="toolbarDemo">
- <div class="layui-btn-container">
- <button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据button>
- <button class="layui-btn layui-btn-sm" lay-event="getData">获取当前页数据button>
- <button class="layui-btn layui-btn-sm" id="dropdownButton">
- 下拉按钮
- <i class="layui-icon layui-icon-down layui-font-12">i>
- button>
- <button class="layui-btn layui-btn-sm layui-bg-blue" id="reloadTest">
- 重载测试
- <i class="layui-icon layui-icon-down layui-font-12">i>
- button>
- <button class="layui-btn layui-btn-sm layui-btn-primary" id="rowMode">
- <span>{{= d.lineStyle ? '多行' : '单行' }}模式span>
- <i class="layui-icon layui-icon-down layui-font-12">i>
- button>
- div>
- script>
- <script type="text/html" id="cityTpl">
- <select id="demoCity1" class="layui-border" lay-ignore>
- <option value="浙江杭州">浙江杭州option>
- <option value="江西南昌">江西南昌option>
- <option value="湖北武汉">湖北武汉option>
- <option value="湖南长沙">湖南长沙option>
- select>
- script>
- <script type="text/html" id="barDemo">
- <div class="layui-clear-space">
- <a class="layui-btn layui-btn-xs" lay-event="edit">编辑a>
- <a class="layui-btn layui-btn-xs" lay-event="more">
- 更多
- <i class="layui-icon layui-icon-down">i>
- a>
- div>
- script>
- <script src="/cdn.staticfile.org/layui/2.8.0/layui.js">script>
- <script>
- layui.use(['table', 'dropdown'], function(){
- var table = layui.table;
- var dropdown = layui.dropdown;
-
- // 创建渲染实例
- table.render({
- elem: '#test'
- ,url:'/static/json/table/demo1.json' // 此处为静态模拟数据,实际使用时需换成真实接口
- ,toolbar: '#toolbarDemo'
- ,defaultToolbar: ['filter', 'exports', 'print', {
- title: '提示'
- ,layEvent: 'LAYTABLE_TIPS'
- ,icon: 'layui-icon-tips'
- }]
- ,height: 'full-35' // 最大高度减去其他容器已占有的高度差
- ,css: [ // 重设当前表格样式
- '.layui-table-tool-temp{padding-right: 145px;}'
- ].join('')
- ,cellMinWidth: 80
- ,totalRow: true // 开启合计行
- ,page: true
- ,cols: [[
- {type: 'checkbox', fixed: 'left'}
- ,{field:'id', fixed: 'left', width:80, title: 'ID', sort: true, totalRowText: '合计:'}
- ,{field:'username', width:80, title: '用户'}
- ,{field:'email', title:'邮箱 ', fieldTitle: '邮箱', hide: 0, width:150, edit: 'text'}
- ,{field:'sex', width:80, title: '性别', sort: true}
- ,{field:'city', width:115, title: '城市', minWidth:115, templet: '#cityTpl', exportTemplet: function(d, obj){
- // console.log(obj)
- // 处理该字段的导出数据
- var td = obj.td(this.field); // 获取当前 td
- return td.find('select').val();
- }}
- ,{field:'sign', title: '签名', edit: 'textarea', minWidth: 260, style: '-moz-box-align: start;', totalRow: '人物:唐代:{{= d.TOTAL_ROW.era.tang }} 宋代:{{= d.TOTAL_ROW.era.song }} 现代:{{= d.TOTAL_ROW.era.xian }}'}
- ,{field:'experience', width: 100, title: '积分', sort: true, totalRow: '{{= d.TOTAL_NUMS }} 😊'}
- ,{field:'checkin', title:'打卡', width: 100, sort: true, totalRow: '{{= parseInt(d.TOTAL_NUMS) }} 次'}
- ,{field:'ip', title:'IP', width: 120}
- ,{field:'joinTime', title:'加入时间', width: 120}
- ,{fixed: 'right', title:'操作', width: 134, minWidth: 125, toolbar: '#barDemo'}
- ]]
- ,done: function(){
- var id = this.id;
- // 下拉按钮测试
- dropdown.render({
- elem: '#dropdownButton' // 可绑定在任意元素中,此处以上述按钮为例
- ,data: [{
- id: 'add',
- title: '添加'
- },{
- id: 'update',
- title: '编辑'
- },{
- id: 'delete',
- title: '删除'
- }]
- // 菜单被点击的事件
- ,click: function(obj){
- var checkStatus = table.checkStatus(id)
- var data = checkStatus.data; // 获取选中的数据
- switch(obj.id){
- case 'add':
- layer.open({
- title: '添加',
- type: 1,
- area: ['80%','80%'],
- content: '自定义表单元素'
- });
- break;
- case 'update':
- if(data.length !== 1) return layer.msg('请选择一行');
- layer.open({
- title: '编辑',
- type: 1,
- area: ['80%','80%'],
- content: '自定义表单元素'
- });
- break;
- case 'delete':
- if(data.length === 0){
- return layer.msg('请选择一行');
- }
- layer.msg('delete event');
- break;
- }
- }
- });
-
- // 重载测试
- dropdown.render({
- elem: '#reloadTest' // 可绑定在任意元素中,此处以上述按钮为例
- ,data: [{
- id: 'reload',
- title: '重载'
- },{
- id: 'reload-deep',
- title: '重载 - 参数叠加'
- },{
- id: 'reloadData',
- title: '仅重载数据'
- },{
- id: 'reloadData-deep',
- title: '仅重载数据 - 参数叠加'
- }]
- // 菜单被点击的事件
- ,click: function(obj){
- switch(obj.id){
- case 'reload':
- // 重载 - 默认(参数重置)
- table.reload('test', {
- where: {
- abc: '123456'
- //,test: '新的 test2'
- //,token: '新的 token2'
- }
- /*
- ,cols: [[ // 重置表头
- {type: 'checkbox', fixed: 'left'}
- ,{field:'id', title:'ID', width:80, fixed: 'left', unresize: true, sort: true, totalRowText: '合计:'}
- ,{field:'sex', title:'性别', width:80, edit: 'text', sort: true}
- ,{field:'experience', title:'积分', width:80, sort: true, totalRow: true, templet: '{{= d.experience }} 分'}
- ,{field:'logins', title:'登入次数', width:100, sort: true, totalRow: true}
- ,{field:'joinTime', title:'加入时间', width:120}
- ]]
- */
- });
- break;
- case 'reload-deep':
- // 重载 - 深度(参数叠加)
- table.reload('test', {
- where: {
- abc: 123
- ,test: '新的 test1'
- }
- //,defaultToolbar: ['print'] // 重载头部工具栏右侧图标
- //,cols: ins1.config.cols
- }, true);
- break;
- case 'reloadData':
- // 数据重载 - 参数重置
- table.reloadData('test', {
- where: {
- abc: '123456'
- //,test: '新的 test2'
- //,token: '新的 token2'
- }
- ,scrollPos: 'fixed' // 保持滚动条位置不变 - v2.7.3 新增
- ,height: 2000 // 测试无效参数(即与数据无关的参数设置无效,此处以 height 设置无效为例)
- //,url: '404'
- //,page: {curr: 1, limit: 30} // 重新指向分页
- });
- break;
- case 'reloadData-deep':
- // 数据重载 - 参数叠加
- table.reloadData('test', {
- where: {
- abc: 123
- ,test: '新的 test1'
- }
- }, true);
- break;
- }
- layer.msg('可观察 Network 请求参数的变化');
- }
- });
-
- // 行模式
- dropdown.render({
- elem: '#rowMode'
- ,data: [{
- id: 'default-row',
- title: '单行模式(默认)'
- },{
- id: 'multi-row',
- title: '多行模式'
- }]
- // 菜单被点击的事件
- ,click: function(obj){
- var checkStatus = table.checkStatus(id)
- var data = checkStatus.data; // 获取选中的数据
- switch(obj.id){
- case 'default-row':
- table.reload('test', {
- lineStyle: null // 恢复单行
- });
- layer.msg('已设为单行');
- break;
- case 'multi-row':
- table.reload('test', {
- // 设置行样式,此处以设置多行高度为例。若为单行,则没必要设置改参数 - 注:v2.7.0 新增
- lineStyle: 'height: 95px;'
- });
- layer.msg('即通过设置 lineStyle 参数可开启多行');
- break;
- }
- }
- });
- }
- ,error: function(res, msg){
- console.log(res, msg)
- }
- });
-
- // 工具栏事件
- table.on('toolbar(test)', function(obj){
- var id = obj.config.id;
- var checkStatus = table.checkStatus(id);
- var othis = lay(this);
- switch(obj.event){
- case 'getCheckData':
- var data = checkStatus.data;
- layer.alert(layui.util.escape(JSON.stringify(data)));
- break;
- case 'getData':
- var getData = table.getData(id);
- console.log(getData);
- layer.alert(layui.util.escape(JSON.stringify(getData)));
- break;
- case 'LAYTABLE_TIPS':
- layer.alert('自定义工具栏图标按钮');
- break;
- };
- });
-
- // 触发单元格工具事件
- table.on('tool(test)', function(obj){ // 双击 toolDouble
- var data = obj.data; // 获得当前行数据
- // console.log(obj)
- if(obj.event === 'edit'){
- layer.open({
- title: '编辑 - id:'+ data.id,
- type: 1,
- area: ['80%','80%'],
- content: '自定义表单元素'
- });
- } else if(obj.event === 'more'){
- // 更多 - 下拉菜单
- dropdown.render({
- elem: this, // 触发事件的 DOM 对象
- show: true, // 外部事件触发即显示
- data: [{
- title: '查看',
- id: 'detail'
- },{
- title: '删除',
- id: 'del'
- }],
- click: function(menudata){
- if(menudata.id === 'detail'){
- layer.msg('查看操作,当前行 ID:'+ data.id);
- } else if(menudata.id === 'del'){
- layer.confirm('真的删除行 [id: '+ data.id +'] 么', function(index){
- obj.del(); // 删除对应行(tr)的DOM结构
- layer.close(index);
- // 向服务端发送删除指令
- });
- }
- },
- align: 'right', // 右对齐弹出
- style: 'box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);' // 设置额外样式
- })
- }
- });
-
- // 触发表格复选框选择
- table.on('checkbox(test)', function(obj){
- console.log(obj)
- });
-
- // 触发表格单选框选择
- table.on('radio(test)', function(obj){
- console.log(obj)
- });
-
- // 行单击事件
- table.on('row(test)', function(obj){
- //console.log(obj);
- //layer.closeAll('tips');
- });
- // 行双击事件
- table.on('rowDouble(test)', function(obj){
- console.log(obj);
- });
-
- // 单元格编辑事件
- table.on('edit(test)', function(obj){
- var field = obj.field; // 得到字段
- var value = obj.value; // 得到修改后的值
- var data = obj.data; // 得到所在行所有键值
- // 值的校验
- if(field === 'email'){
- if(!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(obj.value)){
- layer.tips('输入的邮箱格式不正确,请重新编辑', this, {tips: 1});
- return obj.reedit(); // 重新编辑 -- v2.8.0 新增
- }
- }
- // 编辑后续操作,如提交更新请求,以完成真实的数据更新
- // …
- layer.msg('编辑成功', {icon: 1});
-
- // 其他更新操作
- var update = {};
- update[field] = value;
- obj.update(update);
- });
- });
- script>
- body>
- html>
静态表格是指内容已经存在于页面中的 七:自定义样式 table 提供了以下三种渲染模式,在实际使用时,一般按情况选择其中一种即可。 元素,且可通过一些特定属性设定不同风格
三:模板配置渲染
四:静态表格转换
五:已知数据渲染
六:自定义模板
API
API 描述 var table = layui.table 获得 table 模块。table.render(options) table 组件渲染,核心方法。 table.init(filter, options) 初始化渲染静态表格。 table.reload(id, options, deep) 表格完整重载。 table.reloadData(id, options, deep) 2.7+ 表格数据重载。 table.checkStatus(id) 获取选中行相关数据。 table.setRowChecked(id, opts) 2.8+ 设置行选中状态。 table.getData(id) 获取当前页所有行表格数据。 table.cache 获取表格缓存数据集(包含特定字段)。 table.resize(id) 重置表格尺寸。 table.exportFile(id, data, opts) 导出表格数据到本地文件。 table.getOptions(id) 2.8+ 获取表格实例配置项。 table.hideCol(id, cols) 2.8+ 设置表格列的显示隐藏属性。 table.on('event(filter)', callback) table 相关事件。 渲染
渲染方式 描述 方法配置渲染 通过 table 组件提供的核心方法 table.render(options) 完成的渲染。推荐模板配置渲染 通过 标签的
lay-options="{}" 属性定义模板,组件自动对其进行解析并完成渲染。静态表格渲染 对一段已经包含数据内容的静态表格进行动态化转换,使其具备 table 组件的相关功能。
苹果或挖走Meta AR公关总监,2022年的头显是真的要来了?
Qemu 启动无法交互的处理方法
提高篇(三):交互设计与用户输入:打造更具互动性的Processing作品
MySQL 8.0 架构 之 慢查询日志(Slow query log)(2)流程图:查询记录到慢查询日志中的条件
在OpenCloudOS 上安装.NET 6
LeetCode 1624. 两个相同字符之间的最长子字符串
redis 技术分享
汇编经典程序——将一个字节数据以十六进制形式显示
CodeTalker 踩坑实录