详解和实现数据表格中的行数据合并功能
theme: smartblue
前言
需求场景:
在提供了数据查看和修改的表格视图中(如table、a-table等…),允许用户自行选择多行数据,依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时,页面会即时反馈显示合并后的效果,提供直观的操作反馈。
效果

方案选型
依赖库:vxe-table(:merge-cells="mergeCells"用作效果展示)
核心逻辑
根据数据行中的mergeId是否相等判断是否有过合并操作,前端执行合并操作后需将合并的数据的mergeId设置为相同的数值,并将选中数据中需要合并的数据项置为第一行选中的数据,并在页面展示合并后的效果。
保证两个一致:
- 数据一致性(数据覆盖) 优先级:极高
- 展示一致性(根据mergeId调整展示) 优先级:高
数据源举例
描述: 常规的后端返回结构,数组对象,数组中每一项指代每一条数据。
列表数据示例:
data:[
{mergeId:1,...},
{mergeId:2,...},
{mergeId:3,...}
]
合并逻辑:
- 数据一致性
coverParams:需要覆盖的参数名,存在于列表数据中
firstData:第一条数据
selectRows:选中的数据集合
coverParams.forEach(item => {for (let i = 1; i < number; i++) {// 选中的数据都覆盖第一条数据的值selectRows[i][item] = firstData[item];// }}});
- 展示一致性
newCurrentRows:由于选择时的随机性和数据结构的不稳定性,记录点击的位置点,并将位置点排序记录。
// 生成正序数组newCurrentRowsconst newCurrentRows = currentRows.sort((a, b) => a - b);
// 若newCurrentRows数据不连续 则将选中数据都置为队尾const isEqual = newCurrentRows.every((value, index, array) => {if (index === 0) {return true;} else {return value === array[index - 1] + 1;}})
情况1:选中的数据连续
coverCols:需要合并的行号组,字段的展示位置,用作生成mergeCells
firstRow:第一行位置
number:对应rowspan,得到跨几行的数据
// 获取选中了几条数据const number = state.selectRows.length;// 取第一个行号const firstRow = newCurrentRows[0];
if (isEqual) {
const mergeCellsArr = [];coverCols.forEach(item => {mergeCellsArr.push({row: firstRow,col: item,rowspan: number,colspan: 1});});mergeCells.value = mergeCellsArr;
}
情况2:选中的数据不连续
核心处理:将不连续的数据处理取出放置队尾,满足连续条件继续操作。
// 非选中的数据const fristElements = [];// 选中的数据集合const secondElements = [];// // 选中的数据置于队尾// // 遍历原始数组const dataNumber = dataSource.value.length;for (let i = 0; i < dataNumber; i++) {// 如果i在 newCurrentRows中不存在,则将其置于fristElements前列if (!newCurrentRows.includes(i)) {fristElements.push(dataSource.value[i]);}// // 如果i在 newCurrentRows中存在,则将其置于fristElements后列if (newCurrentRows.includes(i)) {secondElements.push(dataSource.value[i]);}}const newSecondElements = secondElements.map(item => {return {...item};});// 将新数组的元素追加到原始数组的末尾dataSource.value = fristElements.concat(newSecondElements);
存在合并标识的数据处理
主要用作数据中存在mergeId标记如何展示合并效果。
// 初始数据根据mergeId组装合并效果const baseDataMerge = () => {// coverCols 需要合并的列号 注塑全新const baseCoverCols = getCoverCols();// length 需要合并的行数const mergedCells = [];dataSource.value.forEach((row, rowIndex) => {//检查当前行的mergeId是否和下一行的mergeId一样 且mergeId存在if (rowIndex < dataSource.value.length - 1 &&row.mergeId === dataSource.value[rowIndex + 1].mergeId &&row.mergeId !== undefined) {// 仅在第一次符合条件时 判断横跨几行 默认跨两行if (dataSource.value[rowIndex + 3] &&row.mergeId === dataSource.value[rowIndex + 3].mergeId) {// 横跨3行state.mergeLength = 4;} else if (dataSource.value[rowIndex + 2] &&row.mergeId === dataSource.value[rowIndex + 2].mergeId) {// 横跨4行state.mergeLength = 3;} else {// 横跨2行state.mergeLength = 2;}baseCoverCols.forEach(item => {mergedCells.push({row: rowIndex, // 开始行,由符合条件的rowspan: state.mergeLength, // 合并行数,由选中的数据条数决定col: item,colspan: 1});});state.mergeFlag = true;}});console.log('初始数据合并效果', mergedCells);return mergedCells;};
相关文章:
详解和实现数据表格中的行数据合并功能
theme: smartblue 前言 需求场景: 在提供了数据查看和修改的表格视图中(如table、a-table等…),允许用户自行选择多行数据,依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时,页面会即时反…...
深度学习-05-反向传播理论知识
深度学习-05-反向传播理论知识 本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动…...
黑马程序员——Spring框架——day04——SpringMVC基础
目录: SpringMVC简介 背景SpringMVC概述技术体系定位快速入门 目的需求步骤代码实操测试工具 PostMan简介PostMan安装PostMan使用知识点总结请求与参数处理 请求路径 环境准备问题分析解决方式请求方式 环境准备技术分析参数 基本数据类型POJO嵌套POJO数组集合&…...
SpaceX间接「颠覆」了手机?星链如何直连手机通信?
SpaceX 旗下的星链项目推出了一个极具颠覆性的技术——direct to cell(DTC),即通过卫星直接与手机建立通信。这项技术无需对手机进行任何改装,大多数普通手机都可以直接接入星链的卫星网络,实现全球范围内的手机信号覆…...
初识C++ · 模拟实现stack和Queue
目录 前言: 1 Stack 1.1 双端队列 2 Queue 前言: 经历了list三个自定义类型的洗礼,来个简单的放松放松,即栈和队列: 文档记录的,栈和队列是一种容器适配器,它们不属于stl,但是它…...
MFC工控项目实例之一主菜单制作
1、本项目用在WIN10下安装的vc6.0兼容版实现。创建项目名为SEAL_PRESSURE的MFC对话框。在项目res文件下添加相关256色ico格式图片。 2、项目名称:密封压力试验机 主菜单名称: 系统参数 SYS_DATA 系统测试 SYS_TEST 选择型号 TYP_CHOICE 开始试验 TES_STA…...
JVMの堆、栈内存存储
1、JVM栈的数据存储 通过前面的学习,我们知道,将源代码编译成字节码文件后,JVM会对其中的字节码指令解释执行,在解释执行的过程中,又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…...
二叉树—堆(C语言实现)
一、树的概念及结构 1.树的概念 树是一种非线性的数据结构,它是有n(n > 0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下。 ● 有一个特殊的结点…...
儿童有声挂图的芯片AD156—云信通讯
有声挂图是一种结合了图像和声音的媒体形式,用户可以触发图像上的声音,从而获得与图像内容相关的音频信息。这种融合了视觉和听觉的交互方式,既满足了人们对美感和观感的需求,又提高了信息传递的效果和效率。 有声挂图作为孩子的…...
AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.04.25-2024.05.01
文章目录~ 1.Soft Prompt Generation for Domain Generalization2.Modeling Caption Diversity in Contrastive Vision-Language Pretraining3.Q-GroundCAM: Quantifying Grounding in Vision Language Models via GradCAM4.HELPER-X: A Unified Instructable Embodied Agent t…...
gdb调试常见指令
quit:退出gdb list/l:l 文件名:行号/函数名,l 行号/函数名 b:b 文件名:行号/函数名,b 行号/函数名 info/i: info b d:d 断电编号 disable/enable 断电编号:使能(关闭࿰…...
二进制安装mysql8.1
MySQL的安装各个版本步骤几乎一致,本文以安装8.1为例 创建用户及安装需要的依赖包 创建用户及用户组 groupadd mysql useradd -g mysql -s /sbin/nologin mysql 安装依赖包 apt install libncurses5 libncursesw5 libaio1 numactl wget -y 获取二进制包 可以…...
前端工程化工具系列(六)—— VS Code(v1.89.1):强大的代码编辑器
VS Code(Visual Studio Code)是一款由微软开发的强大且轻量级的代码编辑器,支持多种编程语言,并提供了丰富的扩展插件生态系统。 这里主要介绍如何使用配置 ESLint、Stylelint 等插件来提升开发效率。 1 自动格式化代码 最终要…...
重学java 59.Properties属性集集合嵌套集合下总结
不要咀嚼小小悲观,而忘掉整个世界 —— 24.6.3 一、Properties集合(属性集) 1.概述 Properties 继承 于HashTable 2.特点 a、key唯一,value可重复 b、无序 c、无索引 d、线程安全 e、不能存null键,null值 f、Propertie…...
Kafka系列之高频面试题
基础 简介 特点: 高吞吐、低延迟:kafka每秒可以处理几十万条消息,延迟最低只有几毫秒,每个Topic可以分多个Partition,Consumer Group对Partition进行Consumer操作可扩展性:Kafka集群支持热扩展持久性、可…...
SIP通话分析
20240603 - 引言 分析SIP协议的时候,发现了几个问题。虽然说,从整体上来看这个SIP的通话流程也没麻烦,实际上从RFC的概述部分就已经基本上就已经了解了全貌。但在实际的场景中,很多字段起到的作用就不太一样了。 虽然一开始的时…...
【SVG 生成系列论文(九)】如何通过文本生成 svg logo?IconShop 模型推理代码详解
SVG 生成系列论文(一) 和 SVG 生成系列论文(二) 分别介绍了 StarVector 的大致背景和详细的模型细节。SVG 生成系列论文(三)和 SVG 生成系列论文(四)则分别介绍实验、数据集和数据增…...
有哪些兼职软件一天能赚几十元?盘点十个能长期做下去的挣钱软件
在当今这个信息泛滥的时代,众人纷纷寻求迅速致富的捷径。许多人在从事兼职或副业时,并不期望取得巨大的成就,只要每天能额外收入数十元,便已心满意足。 今天,我将带领大家深入探究,揭开那些隐藏在日常生活…...
ubuntu 22.04配置静态ip
ubuntu 22.04配置静态ip vim /etc/netplan/01-network-manager-all.yaml# Let NetworkManager manage all devices on this system network:renderer: NetworkManagerethernets:enp4s0f1:addresses:- 192.168.1.18/24dhcp4: falseroutes:- to: defaultvia: 192.168.1.1nameser…...
C++ 使用 nlohmann/json 库
C常用 json 库有: Jsoncpp boost ison Qt Json (不推荐使用) nlohman::json (推荐使用) 其中Qt中json解析的相关类只在qt中有用,为了避免以后不用qt无法解析json,建议使用nlohmann/json,适用于任何C框架。 1. 简介 nlohmann是一…...
ArcGIS注记层优化技巧:从动态标注到多比例尺完美适配
1. 为什么需要注记层优化 做地图的朋友们应该都遇到过这样的烦恼:同一张地图在不同比例尺下查看时,标注要么挤成一团互相遮盖,要么小得像蚂蚁根本看不清。我之前做水系地图时就深有体会——放大看河道时,河流名称把整条河道都盖住…...
OpenClaw+Qwen3-32B-Chat镜像:自媒体内容生产全流程自动化
OpenClawQwen3-32B-Chat镜像:自媒体内容生产全流程自动化 1. 为什么需要自动化内容生产? 作为一个自媒体创作者,我每天要花大量时间在重复性工作上:追踪热点、构思选题、撰写大纲、生成初稿、设计封面、多平台发布...这些工作占…...
【gis系列】从等高线到地形分析:dem生成与高程、坡度、坡向解析
1. 从等高线到DEM:数据准备与处理 搞地形分析的朋友们都知道,DEM(数字高程模型)是我们的基础粮草。但很多人卡在第一步——怎么把原始等高线数据变成可用的DEM?我当年第一次做这个的时候,踩了不少坑&#x…...
GraphSAGE实战:用PyTorch Geometric从零实现一个‘归纳式’节点分类器(附完整代码)
GraphSAGE实战:用PyTorch Geometric实现归纳式节点分类器 在社交网络分析、推荐系统和生物信息学等领域,图数据无处不在。传统深度学习模型难以直接处理这种非欧几里得结构的数据,而图神经网络(GNN)的出现改变了这一局面。GraphSAGE作为GNN家…...
从零到一:基于UTS与原生插件融合的UniApp安卓桌面小部件开发实践
1. 为什么UniApp开发者需要关注安卓桌面小部件? 作为一名长期使用UniApp的开发者,我最近在项目中遇到了一个有趣的需求:为安卓用户开发桌面小部件。你可能和我当初一样,觉得这个小功能可有可无。但当我真正在手机上使用了几款优秀…...
STC51单片机串口ISP下载程序全攻略
1. STC51单片机ISP串口下载程序详解作为一名嵌入式开发工程师,我经常需要给各种单片机下载程序。STC51系列单片机因其性价比高、开发简单而广受欢迎。今天我就来详细讲解STC51单片机通过串口ISP下载程序的全过程,包括硬件连接、软件配置和常见问题处理。…...
苍穹外卖需要注意的地方
公共字段自动填充自定义注解AutoFill公共字段自动填充和反射有很大的关系公共字段填充中自定义注解AutoFill ->反射在查找给某个方法进行公共字段填充的时候的标识反射与注解认识注解属性名后面要加()在使用的时候把注解写在方法上,括号内…...
保姆级教程:在Ubuntu 20.04上从零搭建AFL++模糊测试环境(含QEMU模式配置与常见报错解决)
从零构建AFL模糊测试环境:Ubuntu 20.04实战手册与深度排错指南 模糊测试作为现代软件安全领域的核心技术之一,正在重新定义漏洞挖掘的效率和深度。当传统人工审计难以应对日益复杂的代码规模时,AFL以其智能化的变异策略和精准的路径追踪能力&…...
C++ 与 事务多版本并发控制(MVCC):在 C++ 存储内核中利用时间戳排序实现无锁读写冲突控制
各位开发者、架构师,以及对高性能并发系统充满热情的同仁们,大家好!今天,我们将深入探讨一个在现代数据库和存储系统中至关重要的主题:多版本并发控制(MVCC),并聚焦于如何在 C 存储内…...
AI学习笔记二
一,NumPy库1,定义NumPy 是 Python 科学计算的核心库,专为多维数组(ndarray) 设计,比 Python 原生列表快 10~100 倍,是数据分析、机器学习、深度学习的基础。2,基础代码示例import nu…...
