Layui表格合并、表格折叠树

1、核心代码:

  let tableMerge = layui.tableMerge; // 引入合并的插件,插件源文件在最后let tableData = [{pid: 0,cid: 111,sortNum: 1, // 序号pName: '数据父元素1',name: '数据1',val: '20',open: true, // 子树是否展开hasChild: true, // 有子数据opt: '数据父元素1',}, {pid: 111,sortNum: 1,pName: '数据父元素1',cid: '1-1',name: '数据1-1',val: '1',opt: '数据父元素1',open: true,hasChild: false, // 无子数据},{pid: 111,sortNum: 1,pName: '数据父元素1',cid: '1-2',name: '数据1-2',val: '2',opt: '数据父元素1',open: true,hasChild: false,},{pid: 111,sortNum: 1,pName: '数据父元素1',cid: '1-3',name: '数据1-3',val: '3',opt: '数据父元素1',open: true,hasChild: false,},{pid: 1,cid: 222,sortNum: 2,pName: '数据父元素2',name: '数据2',val: '200',open: true, // 子跟随父hasChild: true,opt: '数据父元素2',},{pid: 222,cid: '2-1',name: '数据2-1',val: '10',sortNum: 2,pName: '数据父元素2',opt: '数据父元素2',open: true,hasChild: false,},{pid: 222,cid: '2-2',name: '数据2-2',val: '20',sortNum: 2,pName: '数据父元素2',opt: '数据父元素2',open: true,hasChild: false,},{pid: 222,cid: '2-3',name: '数据2-3',val: '30',sortNum: 2,pName: '数据父元素2',opt: '数据父元素2',open: true,hasChild: false,},{pid: 222,cid: '1-4',name: '数据2-4',val: '40',sortNum: 2,pName: '数据父元素2',opt: '数据父元素2',open: true,hasChild: false,}] // 假数据// 表格渲染
var tableRender = function () {table.render({id: 'tableId',  //做刷新的时候需要用IDtree: {iconIndex: 3, // 展开图标显示在第几列isPidData: true, // // pid形式数据转children形式idName: 'cid', // 子idpidName: 'pid', // 父idopenName: 'open',// 是否默认展开的字段名getIcon: function (d) { // 自定义图标return ''}},elem: '#tableId',	//表格idpage: false//是否显示分页, limit: 100,cols: [[//标题栏{ field: "cid", hide: true },{field: "sortNum", title: "序号", align: "center", width: 80,merge: true,templet: function (item) {return item.sortNum ? '<span style="color:#1E9FFF">' + item.sortNum + '</span>': ''}},{ field: "pName", title: "名称", align: "center", width: 250,merge: true,},{ field: "name", title: "结构", align: "left", width: 250, templet: function (item) {if (item.hasChild) {return `${!item.open?'<i class="layui-icon layui-icon-triangle-r" lay-event="fold_r"></i>':'<i class="layui-icon layui-icon-triangle-d" lay-event="fold_d"></i>'}${item.name}`;} else {return `<div style="padding-left: 20px;">${item.open?item.name: ''}</div>`}} },{field: "val", title: "数据", align: "center", width: 150, templet: function (item) {return item.val}},{field: "opt", title: "操作", align: "center",merge: true, templet: function (item) {return item.sortNum ? '<div style = "color:#01AAED;cursor: pointer" lay-event="navToEchartTanChuang">详情</div>' : ''}}],],data:tableData,//数据渲染完的回调done: function () {tableMerge.render(this)}, event: true})};

2、效果图:

在这里插入图片描述

3、tableMerge源码:

/*** Created by YujieYang.* @name:  子表格扩展* @author: 杨玉杰* @version 1.0*/
layui.define(['table'], function (exports) {var $ = layui.jquery;// 封装方法var mod = {/*** 渲染入口* @param myTable*/render: function (myTable) {var tableBox = $('#'+myTable.id).next().children('.layui-table-box'),$main = $(tableBox.children('.layui-table-body').children('table').children('tbody').children('tr').toArray().reverse()),$fixLeft = $(tableBox.children('.layui-table-fixed-l').children('.layui-table-body').children('table').children('tbody').children('tr').toArray().reverse()),$fixRight = $(tableBox.children('.layui-table-fixed-r').children('.layui-table-body').children('table').children('tbody').children('tr').toArray().reverse()),cols = myTable.cols[0], mergeRecord = {};for (var i = 0; i < cols.length; i++) {var item3 = cols[i], field=item3.field;if (item3.merge) {var mergeField = [field];if (item3.merge !== true) {if (typeof item3.merge == 'string') {mergeField = [item3.merge]} else {mergeField = item3.merge}}mergeRecord[i] = {mergeField: mergeField, rowspan:1}}}$main.each(function (i) {for (var item in mergeRecord) {if (i==$main.length-1 || isMaster(i, item)) {$(this).children('[data-key$="-'+item+'"]').attr('rowspan', mergeRecord[item].rowspan);$fixLeft.eq(i).children('[data-key$="-'+item+'"]').attr('rowspan', mergeRecord[item].rowspan);$fixRight.eq(i).children('[data-key$="-'+item+'"]').attr('rowspan', mergeRecord[item].rowspan);mergeRecord[item].rowspan = 1;} else {$(this).children('[data-key$="-'+item+'"]').remove();$fixLeft.eq(i).children('[data-key$="-'+item+'"]').remove();$fixRight.eq(i).children('[data-key$="-'+item+'"]').remove();mergeRecord[item].rowspan +=1;}}})function isMaster (index, item) {var mergeField = mergeRecord[item].mergeField;var dataLength = layui.table.cache[myTable.id].length;for (var i=0; i<mergeField.length; i++) {if (layui.table.cache[myTable.id][dataLength-2-index][mergeField[i]]!== layui.table.cache[myTable.id][dataLength-1-index][mergeField[i]]) {return true;}}return false;}}};// 输出exports('tableMerge', mod);
});

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

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

相关文章

Docker 相关命令

1. 安装和更新 安装 Docker&#xff1a; sudo yum install docker-ce docker-ce-cli containerd.io 启动 Docker 服务&#xff1a; sudo systemctl start docker 设置 Docker 开机自启&#xff1a; sudo systemctl enable docker 检查 Docker 版本&#xff1a; docker --versi…

代码随想录训练第三十天|01背包理论基础、01背包、LeetCode416.分割等和子集

文章目录 01背包理论基础01背包二维dp数组01背包一维dp数组(滚动数组) 416.分割等和子集思路 01背包理论基础 背包问题的理论基础重中之重是01背包&#xff0c;一定要理解透&#xff01; leetcode上没有纯01背包的问题&#xff0c;都是01背包应用方面的题目&#xff0c;也就是…

MySQL深度分页问题深度解析与解决方案

文章目录 引言深度分页问题的原因解决方案方案一&#xff1a;使用主键索引优化方案二&#xff1a;使用子查询优化方案三&#xff1a;使用INNER JOIN优化方案四&#xff1a;使用搜索引擎 最佳实践结论 引言 在处理包含数百万条记录的大型数据表时&#xff0c;使用MySQL的LIMIT进…

Pytorch深度学习实践(8)多分类任务

多分类问题 多分类问题主要是利用了Softmax分类器&#xff0c;数据集采用MNIST手写数据集 设计方法&#xff1a; 把每一个类别看成一个二分类的问题&#xff0c;分别输出10个概率 但是这种方法存在一种问题&#xff1a;不存在抑制问题&#xff0c;即按照常规来讲&#xff0c…

stm32h7串口发送寄存器空中断

关于stm32串口的发送完成中断UART_IT_TC网上资料挺多的&#xff0c;但是使用发送寄存器空中断UART_IT_TXE的不太多 UART_IT_TC 和 UART_IT_TXE区别 UART_IT_TC 和 UART_IT_TXE 是两种不同的 UART 中断源&#xff0c;用于表示不同的发送状态。它们的主要区别如下&#xff1a; …

raise JSONDecodeError(“Expecting value”, s, err.value) from None

raise JSONDecodeError(“Expecting value”, s, err.value) from None 目录 raise JSONDecodeError(“Expecting value”, s, err.value) from None 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是…

实战: SpringBoot中5种增强的方法 : 加解密、脱敏、格式转换、时间时区处理(码到三十五)

1. 使用JsonSerialize和JsonDeserialize注解 2. 全局配置Jackson的ObjectMapper 3. 使用ControllerAdvice配合InitBinder 4. 自定义HttpMessageConverter 5. 使用AOP进行切面编程 结语 在Spring Boot中&#xff0c;对接口的请求入参和出参进行自定义的增强或者修改&…

数字图像处理笔记(三) ---- 傅里叶变换的基本原理

系列文章目录 数字图像处理笔记&#xff08;一&#xff09;---- 图像数字化与显示 数字图像处理笔记&#xff08;二&#xff09;---- 像素加图像统计特征 数字图像处理笔记&#xff08;三) ---- 傅里叶变换的基本原理 文章目录 系列文章目录前言一、傅里叶变换二、离散傅里叶变…

ChatTTS(文本转语音) 一键本地安装爆火语音模型

想不想让你喜欢的文章&#xff0c;有着一个动听的配音&#xff0c;没错&#xff0c;他就可以实现。 ChatTTS 是一款专为对话场景设计的文本转语音模型&#xff0c;例如 LLM 助手对话任务。它支持英语和中文两种语言。 当下爆火模型&#xff0c;在Git收获23.5k的Star&#xff…

Android中集成前端页面探索(Capacitor 或 Cordova 插件)待完善......

探索目标&#xff1a;Android中集成前端页面 之前使用的webview加载html页面&#xff0c;使用bridge的方式进行原生安卓和html页面的通信的方式&#xff0c;探索capacitor-android插件是如何操作的 capacitor-android用途 Capacitor 是一个用于构建现代跨平台应用程序的开源框…

可消费的媒体类型和可生成的媒体类型

可消费的媒体类型和可生成的媒体类型 在 Spring MVC 中&#xff0c;“可消费的媒体类型”和“可生成的媒体类型”是两个重要的概念&#xff0c;用于控制控制器方法处理和返回的内容类型。它们分别通过 consumes 和 produces 属性来指定。下面是它们的详细区别&#xff1a; 可…

【Pod 详解】Pod 的概念、使用方法、容器类型

《Pod 详解》系列&#xff0c;共包含以下几篇文章&#xff1a; Pod 的概念、使用方法、容器类型Pod 的生命周期&#xff08;一&#xff09;&#xff1a;Pod 阶段与状况、容器的状态与重启策略Pod 的生命周期&#xff08;二&#xff09;&#xff1a;Pod 的健康检查之容器探针Po…

C++入门基础:C++中的常用操作符练习

开头介绍下C语言先&#xff0c;C是一种广泛使用的计算机程序设计语言&#xff0c;起源于20世纪80年代&#xff0c;由比雅尼斯特劳斯特鲁普在贝尔实验室开发。它是C语言的扩展&#xff0c;增加了面向对象编程的特性。C的应用场景广泛&#xff0c;包括系统软件、游戏开发、嵌入式…

智慧医院临床检验管理系统源码(LIS),全套LIS系统源码交付,商业源码,自主版权,支持二次开发

实验室信息系统是集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。一体化设计&#xff0c;与其他系统无缝连接&#xff0c;全程化条码管理。支持危机值管…

DataX(二):DataX安装与入门

1. 官方地址 下载地址&#xff1a;http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 源码地址&#xff1a;GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。 2. 前置要求 Linux JDK(1.8 以上&#xff0c;推荐 1.8) Python(推荐 Pyt…

一文总结代理:代理模式、代理服务器

概述 代理在计算机编程领域&#xff0c;是一个很通用的概念&#xff0c;包括&#xff1a;代理设计模式&#xff0c;代理服务器等。 代理类持有具体实现类的实例&#xff0c;将在代理类上的操作转化为实例上方法的调用。为某个对象提供一个代理&#xff0c;以控制对这个对象的…

测试分类篇

按测试对象划分 这里可以分为界面测试, 可靠性测试, 容错率测试, 文档测试, 兼容性测试, 安装卸载测试, 安全测试, 性能测试, 内存泄露测试. 界面测试 界面测试&#xff08;简称UI测试)&#xff0c;指按照界面的需求&#xff08;一般是UI设计稿&#xff09;和界面的设计规则…

Vue3+element-plus 实现图片图片

在看下面内容之前,请一定要去看看 element-plus 中上传组件 el-upload组件 上传组件 重点关注下面几个属性 :auto-upload“false” , 关闭自动上传 :on-change“onUploadFile” 监听上传情况 简单示例: <el-form-item label"文章封面" prop"cover_img"&…

flume知识点

1. 简述什么是Flume &#xff1f; flume 作为 cloudera 开发的实时日志收集系统&#xff0c;受到了业界的认可与广泛应用。Flume 初始的发行版本目前被统称为 Flume OG&#xff08;original generation&#xff09;&#xff0c;属于 cloudera。 但随着 FLume 功能的扩展&#…

AI大模型学习必备十大网站

随着人工智能技术的快速发展&#xff0c;AI大模型&#xff08;如GPT-3、BERT等&#xff09;在自然语言处理、计算机视觉等领域取得了显著的成果。对于希望深入学习AI大模型的开发者和研究者来说&#xff0c;找到合适的学习资源至关重要。本文将为大家推荐十大必备网站&#xff…