element实现需同时满足多行合并和展开的表格
element实现需同时满足多行合并和展开的表格
需求描述:
以下面这张图为例,此表格的“一级表格”这一行可能存在多行数据,这种情况下需要将“一级指标”,“一级指标扣分xxx”,“一级指标关联xxx”这三列数据的行展示根据后面数据(“二级指标”,…等)进行合并。同时,对于含有多条“二级指标”的单行数据,需要支持可展开可合并。


技术选择:
当前项目的技术栈是vue3,虽然公司有自己组件库,但是私有库有不完美的地方,而且暴露出来的api不够详细,所以选择了element-plus。
element有案例提供“合并行或列”和“展开行的表格”,但是没有提供两者混合使用的表格,本文章以此为基础进行开发。


技术实现:
1. span-method
这是el-table中提供的合并行或列的计算方法以本段代码中提供的objectSpanMethod为例:
-
判断是否为子行:
const isChildRow = row.first === "";:通过检查row.first是否为空字符串来判断当前行是否为子行。
-
处理列索引小于等于2的情况:
-
如果当前行有子行 (
row.children),进一步检查当前行是否展开 (
row.expanded):
- 如果展开,返回
rowspan为子行数加1,colspan为1。 - 如果未展开,返回
rowspan和colspan都为1。
- 如果展开,返回
-
如果当前行是子行,返回
rowspan和colspan都为0,表示不显示该单元格。 -
如果当前行既不是子行也没有子行,返回
rowspan和colspan都为1。
-
-
处理列索引大于2的情况:
- 默认返回
rowspan和colspan都为1。
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {// 判断当前行是否为子行const isChildRow = row.first === "";// 如果列索引小于等于2 这里因为是前三列数据需要合并if (columnIndex <= 2) {// 如果当前行有子行if (row.children) {// 如果当前行是展开状态if (row.expanded) {return {rowspan: row.children.length + 1, // 合并行数为子行数加1colspan: 1, // 合并列数为1};} else {return {rowspan: 1, // 合并行数为1colspan: 1, // 合并列数为1};}} else if (isChildRow) {// 如果当前行是子行return {rowspan: 0, // 不显示该单元格colspan: 0, // 不显示该单元格};} else {// 如果当前行既不是子行也没有子行return {rowspan: 1, // 合并行数为1colspan: 1, // 合并列数为1};}}// 对于列索引大于2的情况,默认返回合并行数和列数都为1return {rowspan: 1,colspan: 1,}; }; - 默认返回
2. expand-change
当用户对某一行展开或者关闭的时候会触发该事件(展开行时,回调的第二个参数为 expandedRows;树形表格时第二参数为 expanded)
- 保证数据状态同步:在行展开或折叠时,更新
row.expanded属性可以让合并单元格的逻辑(如objectSpanMethod)根据当前状态返回正确的rowspan和colspan值。 - 刷新布局保证显示正确:由于 Vue 更新 DOM 是异步的,使用
nextTick确保在数据更新后再调用表格组件的doLayout方法,避免因布局未刷新而出现错位问题。 - 应对树形结构合并单元格:对于存在 children 的行,其展开/折叠状态直接影响整个表格的显示效果,因此立即刷新布局可以确保所有合并单元格重新计算后显示正常。
const handleExpandChange = (row, expanded) => {if (row.children) {row.expanded = expanded;
// 使用 nextTick 包裹一个回调函数,确保在 Vue 完成 DOM 更新之后再刷新表格布局。nextTick(() => {// 如果 el-table 提供 doLayout 方法则调用刷新布局tableRef.value?.doLayout && tableRef.value.doLayout();});}
};
全部代码:
<template><el-tableref="tableRef":data="originalData"style="width: 100%; margin-bottom: 20px"row-key="id"border:span-method="objectSpanMethod":tree-props="{ children: 'children' }"@expand-change="handleExpandChange"><el-table-column prop="first" label="一级指标" /><el-table-column prop="directDeductPoint" label="一级指标扣分范围" /><el-table-column prop="relatedProcessVOS" label="一级指标关联流程" /><el-table-column prop="second" label="二级指标" /><el-table-column prop="third" label="三级指标" /><el-table-column prop="evalDesc" label="考核说明" /><el-table-column prop="deductType" label="考核扣分范围" /><el-table-column prop="enableYn" label="是否启用" /></el-table>
</template><script lang="ts" setup>
import { ref, nextTick } from "vue";// 获取表格组件 ref
const tableRef = ref(null);const originalData = ref([{id: 1,first: "一级指标1111",directDeductPoint: "一级指标扣分范围1111",relatedProcessVOS: "一级指标关联流程1111",second: " 二级指标1111",third: "三级指标1111",evalDesc: "考核说明1111",deductType: "考核扣分范围1111",enableYn: "是",},{id: 2,first: "一级指标2222",directDeductPoint: "一级指标扣分范围2222",relatedProcessVOS: "一级指标关联流程2222",second: "",third: " ",evalDesc: "",deductType: "",enableYn: "",children: [{id: 31,first: "",directDeductPoint: "",relatedProcessVOS: "",second: "二级指标212121",third: "三级指标212121",evalDesc: "考核说明212121",deductType: "考核扣分范围212121",enableYn: "是",},{id: 32,first: "",directDeductPoint: "",relatedProcessVOS: "",second: "二级指标222222",third: " 三级指标222222",evalDesc: "考核说明222222",deductType: "考核扣分范围222222",enableYn: "是",},],},{id: 3,first: "一级指标3333",directDeductPoint: "一级指标扣分范围3333",relatedProcessVOS: "一级指标关联流程3333",second: "二级指标3333",third: "三级指标3333",evalDesc: "考核说明3333",deductType: "考核扣分范围3333",enableYn: "是",},{id: 4,first: "一级指标4444",directDeductPoint: "一级指标扣分范围4444",relatedProcessVOS: "一级指标关联流程4444",second: "二级指标4444",third: "三级指标4444",evalDesc: "考核说明4444",deductType: "考核扣分范围4444",enableYn: "是",},{id: 5,first: "一级指标5555",directDeductPoint: "一级指标扣分范围5555",relatedProcessVOS: "一级指标关联流程5555",second: "二级指标5555",third: "三级指标5555",evalDesc: "考核说明5555",deductType: "考核扣分范围5555",enableYn: "是",},
]);const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {const isChildRow = row.first === "";if (columnIndex <= 2) {if (row.children) {if (row.expanded) {return {rowspan: row.children.length + 1,colspan: 1,};} else {return {rowspan: 1,colspan: 1,};}} else if (isChildRow) {return {rowspan: 0,colspan: 0,};} else {return {rowspan: 1,colspan: 1,};}}return {rowspan: 1,colspan: 1,};
};const handleExpandChange = (row, expanded) => {console.log("handleExpandChange", row, expanded);if (row.children) {row.expanded = expanded;nextTick(() => {// 如果 el-table 提供 doLayout 方法则调用刷新布局tableRef.value?.doLayout && tableRef.value.doLayout();});}
};
</script><style lang="scss" scoped>
.cus-table {:deep(.cell) {color: #002f59;}.table-column-btn {:deep(.kui-link--primary) {color: #005bac;}}
}
</style>相关文章:
element实现需同时满足多行合并和展开的表格
element实现需同时满足多行合并和展开的表格 需求描述: 以下面这张图为例,此表格的“一级表格”这一行可能存在多行数据,这种情况下需要将“一级指标”,“一级指标扣分xxx”,“一级指标关联xxx”这三列数据的行展示根据后面数据(…...
气象干旱触发水文(农业)干旱的概率及其触发阈值的动态变化-贝叶斯copula模型
前言 在干旱研究中,一个关键的科学问题是:在某一地区发生不同等级的气象干旱时,气象干旱会以何种概率引发不同等级的水文干旱、农业干旱和地下水干旱?换句话说,气象干旱的不同程度会分别引发其他类型干旱的哪种等级&a…...
系统学习算法:专题十二 记忆化搜索
什么是记忆化搜索,我们先用一道经典例题来引入,斐波那契数 题目一: 相信一开始学编程语言的时候,就一定碰到过这道题,在学循环的时候,我们就用for循环来解决,然后学到了递归,我们又…...
c++入门-------命名空间、缺省参数、函数重载
C系列 文章目录 C系列前言一、命名空间二、缺省参数2.1、缺省参数概念2.2、 缺省参数分类2.2.1、全缺省参数2.2.2、半缺省参数 2.3、缺省参数的特点 三、函数重载3.1、函数重载概念3.2、构成函数重载的条件3.2.1、参数类型不同3.2.2、参数个数不同3.2.3、参数类型顺序不同 前言…...
豆包、扣子等产品如何与CSDN合作?
要实现CSDN开发者社区与豆包、扣子等产品的深度合作,构建创作者Agent生态体系,可通过以下结构化方案实现技术、生态与商业价值的闭环(含具体实施路径与数据指标): 一、战略合作框架搭建 开放平台互通 建立三方API网关&…...
51单片机测试题AI作答测试(DeepSeek Kimi)
单片机测试题 DeepSeek Kimi 单项选择题 (10道) 6题8题判断有误 6题判断有误 智谱清言6题靠谱,但仔细斟酌,题目出的貌似有问题,详见 下方。 填空题 (9道) 脉宽调制(Pulse …...
Java实际上只有值传递
在 Java 中,实际上只有值传递,这可以从基本数据类型和引用数据类型两个方面来看。 基本概念 值传递:指在方法调用时,将实际参数的值复制一份传递给形式参数,在方法内部对形式参数的修改不会影响到实际参数。引用传递…...
解析HTML时需要注意什么?
在使用PHP爬虫解析HTML内容时,需要注意以下几个关键点,以确保数据提取的准确性和程序的稳定性。以下是一些重要的注意事项和最佳实践: 1. 选择合适的解析工具 PHP提供了多种工具来解析HTML,但选择合适的工具可以简化开发过程并提…...
去耦电容的作用详解
在霍尔元件的实际应用过程中,经常会用到去耦电容。去耦电容是电路中装设在元件的电源端的电容,其作用详解如下: 一、基本概念 去耦电容,也称退耦电容,是把输出信号的干扰作为滤除对象。它通常安装在集成电路…...
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二)
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…...
深入剖析:基于红黑树实现自定义 map 和 set 容器
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 在 C 标准模板库(STL)的大家庭里,map和set可是超级重要的关联容器成员呢😎&#x…...
20-R 绘图 - 饼图
R 绘图 - 饼图 R 语言提供来大量的库来实现绘图功能。 饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表,用于描述量、频率或百分比之间的相对关系。 R 语言使用 pie() 函数来实现饼图,语法格式如下: pie(x, l…...
第438场周赛:判断操作后字符串中的数字是否相等、提取至多 K 个元素的最大总和、判断操作后字符串中的数字是否相等 Ⅱ、正方形上的点之间的最大距离
Q1、判断操作后字符串中的数字是否相等 1、题目描述 给你一个由数字组成的字符串 s 。重复执行以下操作,直到字符串恰好包含 两个 数字: 从第一个数字开始,对于 s 中的每一对连续数字,计算这两个数字的和 模 10。用计算得到的新…...
STM32F4 adc扫描模式采集实验
做adc采集的时候用扫描模式发现读数据时只能读到一个通道的数据,想显示其他几个通道的数据只能进行多次单个扫描,违背了扫描模式的本意,故用ai做了一个将扫描数据用dma储存在内存的adc三通道采集实验,若有巨佬发现有错望告知。 代…...
软考教材重点内容 信息安全工程师 第17章 网络安全应急响应技术原理与应用
17.1 网络安全应急响应概述 网络安全应急响应是针对潜在发生的网络安全事件而采取的网络安全措施。 17.1.1 网络安全应急响应概念 网络安全应急响应是指为应对网络安全事件,相关人员或组织机构对网络安全事件进行监测、预警、分析、响应和恢复等工作。 17.2.3 网络安…...
点击修改按钮图片显示有问题
问题可能出在表单数据的初始化上。在 ave-form.vue 中,我们需要处理一下从后端返回的图片数据,因为它们可能是 JSON 字符串格式。 vue:src/views/tools/fake-strategy/components/ave-form.vue// ... existing code ...Watch(value)watchValue(v: any) …...
Node.js技术原理分析系列——Node.js的perf_hooks模块作用和用法
Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 是基于 Chrome V8 引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应用程序、网络应用、命令行工具等。…...
大模型在术后认知功能障碍预测及临床方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 研究创新点 二、术后认知功能障碍概述 2.1 定义与表现 2.2 危害与影响 2.3 发病机制与相关因素 三、大模型技术原理与应用现状 3.1 大模型技术原理 3.2 大模型在医疗领域的应用 四、基于大模型的术后认知…...
用DeepSeek来帮助学习three.js加载3D太极模形
画一个平面的太极图是很容易,要实现3D的应该会很难 一、参考3D模形效果 看某网页看到一个效果,像一个3D太极球,觉得挺有趣,挺解压的,想进一步去了解下这是如何实现 效果: 链接地址: http://www.…...
【JavaEE进阶】Spring Boot配置文件
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ 目录 SpringBoot配置⽂件 举例: 通过配置文件修改端口号 配置⽂件的格式 properties基本语法 读取配置⽂件 properties配置文件的缺点 yml配置⽂件 yml基本语法 yml和proper…...
学习通用多层次市场非理性因素以提升股票收益预测
“Learning Universal Multi-level Market Irrationality Factors to Improve Stock Return Forecasting” 论文地址:https://arxiv.org/pdf/2502.04737 Github地址:https://github.com/lIcIIl/UMI 摘要 深度学习技术与量化交易相结合,在股…...
【Godot4.3】基于绘图函数的矢量蒙版效果与UV换算
概述 在设计圆角容器时突发奇想: 将圆角矩形的每个顶点坐标除以对应圆角矩形所在Rect2的size,就得到了顶点对应的UV坐标。然后使用draw_colored_polygon,便可以做到用图片填充圆角矩形的效果。而且这种计算的效果就是图片随着其填充的图像缩…...
记一些工具(持续更新)
wireshark——网络抓包工具 mitmproxy ——利用中间人攻击进行https抓包的工具(需配合安装由此代理自己签发的根证书到客户机系统) Cloudflare—— 一个网站中间层,通过基于反向代理的内容分发网络(CDN),Cloudflare提供包括CDN、优化工具、安全、分析以…...
DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!
项目地址:GitHub - deepseek-ai/FlashMLA 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天! 一、开源周震撼启幕 继上周预告后,DeepSeek于北京时间今晨9点准时开源「FlashMLA」,打响开源周五连…...
PCL 点云添加高斯噪声
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在点云模型中将所有的点沿其法向量方向随机偏移一定距离,以此来得到点云实体的噪声点,偏移的幅度与点云尺度有关,偏移距离服从高斯分布,以此来获得高斯分布的噪声数据。 二、实现代码 // 标准文件 #include &l…...
通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形
论文标题 英文标题:Improving TSN Traffic Shaping with Constant Bandwidth Server Scheduling 中文标题:通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形 作者信息 作者:Benjamin van Seggelen 指导教师&am…...
软件测试高频面试题
以下是一些软件测试高频面试题: 基础概念类 HTTP和HTTPS的区别:HTTPS使用SSL/TLS协议对传输数据加密,HTTP没有加密;HTTPS可确保数据完整性,防止传输中被篡改,HTTP不保证;HTTP默认用80端口&…...
英语学习DAY5
内心旁白 关于我为什么从2月5号开的这个篇章现在才第五天这件事? 咳咳咳,容许我狡辩一下,我是有事去忙了,我真的很想每日学习英语(信我兄弟们)! 虽然英语学习对我来说真的很难,你…...
如何查看图片的原始格式
问题描述:请求接口的时候,图片base64接口报错,使用图片url请求正常 排查发现是图片格式的问题: 扩展名可能被篡改:如果文件损坏或扩展名被手动修改,实际格式可能与显示的不同,需用专业工具验证…...
Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来
Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来 在深度学习的优化中,自然梯度下降(Natural Gradient Descent)是一个强大的工具,它利用Fisher信息矩阵(FIM)调整梯度…...
