layui数据表格实现表格中嵌套表格,并且可以折叠展开

news2024/11/15 23:25:18

效果:

思路:

1、最外层的表格先渲染,在done回调中向每个tr后面插入一个用来嵌套子级表格的tr。

tr的class和table的id需要用索引 i 关联

 //向每一行tr后面追加显示子table的tr
                        let trEles = $(".layui-table-view[lay-id=list] tbody tr");
                        for (let i = 0; i < trEles.length; i++) {
                            let childTr = `<tr class="childTR${i+1}">
                        <td></td>
                        <td colspan="16" >
                         <div class="child-table-item">
                            <table id="childTable${i + 1}"></table>
                         </div>
                        </td>
                        </tr>`;
                            $(trEles[i]).after(childTr);
                        }

2、插入完成后再渲染所有的子级表格

//渲染表格
                        for (let i = 0; i < trEles.length; i++) {
                            table.render({
                                elem: `#childTable${i + 1}`
                                , height: "300"
                                , url: "/hkj/Acount/GetSalaryList" //数据接口
                                , method: "POST"
                                , where: {
                                    lsh: tabData[i].lsh,
                                    ListMark: 'jqgrid'
                                }
                                , even: true
                                , page: true //开启分页
                                , cols: [[ //表头
                                    { field: 'NAME', title: '姓名'}
                                    , { field: 'DeptName', title: '部门' }
                                    , { field: 'BS', title: '基本工资' }
                                    , { field: 'PS', title: '岗位工资' }
                                    , { field: 'PB', title: '绩效工资' }
                                    , { field: 'SS', title: '工龄工资' }
                                    , { field: 'PA', title: '通讯补贴' }
                                    , { field: 'TA', title: '交通补贴' }
                                    , { field: 'MA', title: '餐费补贴' }
                                    , { field: 'OA', title: '其他补贴' }
                                    , { field: 'THP', title: '实发工资' }
                                ]]
                                , request: {
                                    pageName: 'pageIndex' //页码的参数名称,默认:page
                                    , limitName: 'pageSize' //每页数据量的参数名,默认:limit
                                }
                                , parseData: function (res) { //res 即为原始返回的数据
                                    return {
                                        "code": 0, //解析接口状态
                                        "msg": "加载成功", //解析提示文本
                                        "count": res.records || 0, //解析数据长度
                                        "data": res.rows //解析数据列表
                                    };
                                }
                            })
                        }

 3、最后监听箭头显示和隐藏对应的表格

 //点击箭头隐藏或显示
                        $(".showOrHide").click(function () {
                            let classStr = $(this).attr("class");
                            let index = $(this).data("index");
                            if (classStr.indexOf("layui-icon-triangle-r") > -1) {
                                //显示
                                $(this).removeClass("layui-icon-triangle-r");
                                $(this).addClass("layui-icon-triangle-d");
                                $(`.childTR${index}`).show();
                            } else {
                                //隐藏
                                $(this).removeClass("layui-icon-triangle-d");
                                $(this).addClass("layui-icon-triangle-r");
                                $(`.childTR${index}`).hide();
                            }
                            
                        })

完整代码:

layui.use('table', function () {
                let table = layui.table;

                //第一个实例
                mainTable = table.render({
                    elem: '#list'
                    , height: "full-100"
                    , url: '/hkj/Acount/GetData' //数据接口
                    , method: "POST"
                    , where: {
                        month: searchMonth,
                        jybz: jybz,
                        dataName: "gz",
                        ListMark: 'jqgrid'
                    }
                    ,even:true
                    , page: true //开启分页
                    , cols: [[ //表头
                        {
                            field: 'id', title: '', width: 30, templet: function (d) {
                                return `<i class="layui-icon layui-icon-triangle-d main-color main-cursor showOrHide" data-index=${d.LAY_INDEX}></i>`;
                            }
                        }
                        , { field: 'yfs1', title: '管理费用',minWidth:70 }
                        , { field: 'yfs2', title: '销售费用', minWidth: 70 }
                        , { field: 'yfs3', title: '研发费用', minWidth: 70 }
                        , { field: 'yfs4', title: '生产车间费', minWidth:90 }
                        , { field: 'yfs6', title: '生产管理费', minWidth: 90 }
                        , { field: 'sb', title: '代扣社保', minWidth: 70 }
                        , { field: 'gjj', title: '代扣公积金', minWidth: 90 }
                        , { field: 'gs', title: '代扣个税', minWidth: 70 }
                        , { field: 'qt', title: '其他代扣', minWidth: 70 }
                        , { field: 'sfgz', title: '实发银行', minWidth: 70 }
                        , { field: 'sfgz_xj', title: '实发现金', minWidth: 70 }
                        , { field: 'yfs5', title: '办公室', minWidth: 70 }
                        , { field: 'credenceNum', title: '凭证号', minWidth: 60 }
                        , {
                            field: 'bzxx', title: '备注', minWidth: 50, templet: function (d) {
                                return `<span style="color:red;">${d.bzxx}</span>`;
                            }
                        }
                        , {
                            field: 'url', title: 'excel', minWidth: 50, templet: function (d) {
                                return `<a target="_blank" href="${d.url}" class="main-color main-hover">查看</a>`;
                            }
                        }
                        , {
                            field: 'lsh', title: '操作', minWidth: 210, templet: function (rowObiect) {
                                let str = '';
                                let b = '';
                                if (!rowObiect.credenceNum) {
                                    if (rowObiect.bzxx.indexOf('[') != -1) {
                                        let a = rowObiect.bzxx.split('[')[1];
                                        b = a.split(']')[0];
                                    }
                                    str += '<a class="layui-btn layui-btn-xs del_public addKM" data-subjkey="' + b + '" data-name="" data-id="' + rowObiect.ID + '"> 添加为科目</a>';
                                    str += '<a class="layui-btn layui-btn-xs del_public pzPreview" data-id="' + rowObiect.ID + '"> 生成凭证</a>';
                                } else {
                                    str += '<a class="layui-btn layui-btn-xs del_public lookPZ" data-id="' + rowObiect.credenceNum + '"> 查看凭证</a>';
                                }

                                str += '<a style="color:#fff" class="layui-btn layui-btn-danger layui-btn-xs del_public delete-btn"  data-id="' + rowObiect.lsh + '"> 删除</a>'

                                return str
                            }
                        }
                    ]]
                    , request: {
                        pageName: 'pageIndex' //页码的参数名称,默认:page
                        , limitName: 'pageSize' //每页数据量的参数名,默认:limit
                    }
                    , parseData: function (res) { //res 即为原始返回的数据
                        return {
                            "code": res.Status ? 0 : -1, //解析接口状态
                            "msg": res.Message, //解析提示文本
                            "count": res.Data.records || 0, //解析数据长度
                            "data": res.Data.rows //解析数据列表
                        };
                    }
                    , done: function (res, curr, count) {
                        let tabData = res.data || [];
                        //向每一行tr后面追加显示子table的tr
                        let trEles = $(".layui-table-view[lay-id=list] tbody tr");
                        for (let i = 0; i < trEles.length; i++) {
                            let childTr = `<tr class="childTR${i+1}">
                        <td></td>
                        <td colspan="16" >
                         <div class="child-table-item">
                            <table id="childTable${i + 1}"></table>
                         </div>
                        </td>
                        </tr>`;
                            $(trEles[i]).after(childTr);
                        }

                        //渲染表格
                        for (let i = 0; i < trEles.length; i++) {
                            table.render({
                                elem: `#childTable${i + 1}`
                                , height: "300"
                                , url: "/hkj/Acount/GetSalaryList" //数据接口
                                , method: "POST"
                                , where: {
                                    lsh: tabData[i].lsh,
                                    ListMark: 'jqgrid'
                                }
                                , even: true
                                , page: true //开启分页
                                , cols: [[ //表头
                                    { field: 'NAME', title: '姓名'}
                                    , { field: 'DeptName', title: '部门' }
                                    , { field: 'BS', title: '基本工资' }
                                    , { field: 'PS', title: '岗位工资' }
                                    , { field: 'PB', title: '绩效工资' }
                                    , { field: 'SS', title: '工龄工资' }
                                    , { field: 'PA', title: '通讯补贴' }
                                    , { field: 'TA', title: '交通补贴' }
                                    , { field: 'MA', title: '餐费补贴' }
                                    , { field: 'OA', title: '其他补贴' }
                                    , { field: 'THP', title: '实发工资' }
                                ]]
                                , request: {
                                    pageName: 'pageIndex' //页码的参数名称,默认:page
                                    , limitName: 'pageSize' //每页数据量的参数名,默认:limit
                                }
                                , parseData: function (res) { //res 即为原始返回的数据
                                    return {
                                        "code": 0, //解析接口状态
                                        "msg": "加载成功", //解析提示文本
                                        "count": res.records || 0, //解析数据长度
                                        "data": res.rows //解析数据列表
                                    };
                                }
                            })
                        }
                        
                        //点击箭头隐藏或显示
                        $(".showOrHide").click(function () {
                            let classStr = $(this).attr("class");
                            let index = $(this).data("index");
                            if (classStr.indexOf("layui-icon-triangle-r") > -1) {
                                //显示
                                $(this).removeClass("layui-icon-triangle-r");
                                $(this).addClass("layui-icon-triangle-d");
                                $(`.childTR${index}`).show();
                            } else {
                                //隐藏
                                $(this).removeClass("layui-icon-triangle-d");
                                $(this).addClass("layui-icon-triangle-r");
                                $(`.childTR${index}`).hide();
                            }
                            
                        })
                    }
                });

            });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/958228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openGauss学习笔记-53 openGauss 高级特性-Ustore

文章目录 openGauss学习笔记-53 openGauss 高级特性-Ustore53.1 设计原理53.2 核心优势53.3 使用指导 openGauss学习笔记-53 openGauss 高级特性-Ustore Ustore 存储引擎&#xff0c;又名 In-place Update 存储引擎&#xff08;原地更新&#xff09;&#xff0c;是 openGauss …

Vite打包性能优化及填坑

最近在使用 Vite4.0 构建一个中型前端项目的过程中&#xff0c;遇到了一些坑&#xff0c;也做了一些项目在构建生产环境时的优化&#xff0c;在这里做一个记录&#xff0c;以便后期查阅。(完整配置在后面) 上面是dist文件夹的截图&#xff0c;里面的内容已经有30mb了&#xff…

开学季ipad手写笔什么牌子好?第三方电容笔推荐

自从ipad之类的平板电脑上出现了电容笔&#xff0c;电容笔就成功的取代了我们的手指&#xff0c;大大加快了我们的写作速度。不过&#xff0c;由于苹果pencil自带的先进芯片&#xff0c;导致其售价一直很高&#xff0c;给很多人&#xff0c;特别是学生&#xff0c;造成了很大的…

Python(Web时代)—— Django操作现有数据库表

Mysql操作 前言 在实际开发过程中&#xff0c;我们经常会遇到数据库表已经建立好了&#xff0c;现在只需要开发项目功能&#xff0c;操作已有数据库表的情况。 Django为我们提供了inspecdb的方法。他的作用即是对已经存在的数据库表来反向映射结构到models.py中. 操作 第一…

前端监听SDK(上报埋点数据)

1、使用方式 <head><script>window.pineapple || (pineapple {});pineapple.param {"src": "http://127.0.0.1:3001/pa.gif","token": "dsadasd2323dsad23dsada",};</script><script src"js/pineapple.j…

sql各种注入案例

目录 1.报错注入七大常用函数 1)ST_LatFromGeoHash (mysql>5.7.x) 2)ST_LongFromGeoHash &#xff08;mysql>5.7.x&#xff09; 3)GTID (MySQL > 5.6.X - 显错<200) 3.1 GTID 3.2 函数详解 3.3 注入过程( payload ) 4)ST_Pointfromgeohash (mysql>5.…

如何截取视频中的一段视频?分享几种视频分割方法

当处理长视频时&#xff0c;视频分割可以使您更加高效。如果您只需要处理其中的一部分&#xff0c;而不是整个视频&#xff0c;那么分割视频可以使您更容易找到需要处理的部分。而且&#xff0c;分割视频还可以使您更容易在不同的项目之间重复使用视频片段。教大家几种简单的视…

前端面试中Vue的有经典面试题一

1. 谈谈你对MVVM开发模式的理解 MVVM分为Model、View、ViewModel三者。 Model&#xff1a;代表数据模型&#xff0c;数据和业务逻辑都在Model层中定义&#xff1b; View&#xff1a;代表UI视图&#xff0c;负责数据的展示&#xff1b; ViewModel&#xff1a;负责监听Model中…

Argument of type {****} is not assignable to parameter of type ‘never‘.ts(2345)

在日常开发中配置eslintTypescript之后&#xff0c;会出先各种校验报错提示&#xff0c;今天在开发过程中遇到ts2345报错&#xff0c;出错场景发生在数组push一个Object对象报错。 const obj { title: , children: [] }; const currentObj obj.children; 其实就是obj.chilr…

C语言每日一练---Day(14)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;统计每个月兔子的总数 数列的和 &#x1f493;博主csdn个人主页&#x…

链表模拟栈

定义节点 class Node {var num: Int _var next: Node _def this(num: Int) {thisthis.num num}override def toString: String s"num[${this.num}]" }定义方法 class LinkStack {private var head new Node(0)def getHead: Node head//判断是否为空def isEmp…

每日一题 1110删点成林

题目 给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c;最后得到一个森林&#xff08;一些不相交的树构成的集合&#xff09;。 返回森林中的每棵树。你可以按任意顺序组…

Pandas+Pyecharts | 2023软科中国大学排名分析可视化

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 数据信息 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 2023中国大学综合排名TOP303.2 2023中国大学各类型占比3.3 2023中国各省地区大学…

Redis 复制(replica)

1. 是什么 1.1 官网地址 https://redis.io/docs/management/replication/ 1.2 一句话 1. 就是主从复制&#xff0c;master以写为主&#xff0c;slave以读为主 2. 当master数据变化的时候&#xff0c;自动将新的数据异步同步到其它slave数据库 2. 能干嘛 1. 读写分离 2. 容灾…

准备HarmonyOS开发环境

引言 在开始 HarmonyOS 开发之前&#xff0c;需要准备好开发环境。本章将详细指导你如何安装 HarmonyOS SDK、配置开发环境、创建 HarmonyOS 项目。 目录 安装 HarmonyOS SDK 配置开发环境 创建 HarmonyOS 项目 总结 1. 安装 HarmonyOS SDK HarmonyOS SDK 是开发 Harmo…

共享办公空间的SWOT分析:

S&#xff08;优势&#xff09;&#xff1a; 灵活性和多样性&#xff1a;共享办公空间通常提供多种套餐和服务&#xff0c;适合不同需求和预算的初创企业和个人。 资源共享和合作&#xff1a;共享办公空间提供了与其他企业家、创新者和专业人士交流和合作的机会&#xff0c;可…

为 LVGL 添加截图/截屏功能(lv_100ask_screenshot)

本文内容选自百问网&#xff0c;完整的演示视频观看&#xff1a; https://www.bilibili.com/video/BV18r4y1X7MJ 前言 lv_100ask_screenshot 是一个基于 lvgl 的屏幕截图工具。 lv_100ask_screenshot 特性&#xff1a; 可以将LVGL的屏幕对象(全屏)保存为图片文件&#xff1…

Deepnote:为什么我停止使用 Jupyter Notebook

Jupyter 笔记本已经成为必不可少多年来用于众多数据科学工作流程的工具。其中包括执行数据挖掘、分析、处理、建模以及在每个数据科学项目的生命周期中执行的一般日常实验任务。 Jupyter(作者提供的图片) 尽管它很受欢迎,但许多数据科学家也指出了它的众多缺点,例如这里和

ThingsKit物联网平台告警中心之告警联系人

告警联系人是指接收告警信息的人&#xff0c;产生告警后&#xff0c;会第一时间通知他。 新增 点击新增告警联系人按钮&#xff0c;填入相关信息&#xff0c;确认新增。 告警联系人参数参数说明联系人姓名 定义告警通知到的联系人名称必填支持输入的格式&#xff1a;中英文…