首页 > 其他分享 >详解和实现数据表格中的行数据合并功能

详解和实现数据表格中的行数据合并功能

时间:2024-06-03 23:58:21浏览次数:18  
标签:const 表格 数据 value 详解 选中 dataSource mergeId


theme: smartblue

前言

需求场景:

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

效果

image.png

方案选型

依赖库: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:由于选择时的随机性和数据结构的不稳定性,记录点击的位置点,并将位置点排序记录。

// 生成正序数组newCurrentRows
    const 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;
  };

标签:const,表格,数据,value,详解,选中,dataSource,mergeId
From: https://blog.csdn.net/qq_43277404/article/details/139426183

相关文章

  • 数据在内存中的存储<C语言>
    导言       在计算机中不同类型的数据在计算机内部存储形式各不相同,弄懂各种数据在计算机内部存储形式是有必要的,C语言的学习不能浮于表面,更要锻炼我们的“内功”,将来在写程序的时候遇见各种稀奇古怪的bug时,也便能迎刃而解,所以本文将着重介绍,整数在内存中的存储、大小......
  • 数据结构单链表的前插法实现
    单链表的前插法实现可以通过以下步骤进行:创建一个新的节点,并将要插入的元素存储在新节点的数据域中。将新节点的指针域指向原链表的头节点。将原链表的头节点指向新节点。具体代码实现如下所示:classNode:def__init__(self,data):self.data=data......
  • 【python】python古代玻璃制品的成分数据分析与可视化(源码+数据+课程论文)【独一无二】
    ......
  • 基于python的汽车数据可视化、推荐及预测系统
    博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在在的写点程序。......
  • 【OpenCV函数详解之cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_
    文章目录cv2.calcOpticalFlowPyrLK()函数介绍:函数定义:参数说明:返回值示例代码执行结果:**总结:**p1,st,err=cv2.calcOpticalFlowPyrLK(old_gray,frame_gray,p0,None,**lk_params)解释:函数:参数:返回值:使用:cv2.calcOpticalFlowPyrLK()函数介绍:cv2.calcOpti......
  • 成为MySQL DBA后,再看ORACLE数据库(六、逻辑存储结构)
    数据库的逻辑存储结构也可以叫做存储层次体系,ORACLE的存储层次体系按照层次从高到低分为:表空间(tablespace)、段(segment)、区(extent)、块(block)。熟悉数据库的逻辑存储结构可以帮助我们分析与定位数据库的空间容量问题。一、段段是表空间的主要组织结构。段就是占用存储空间的数据库......
  • mosh数据库——第十章
    1.触发器触发器是在插入、更新和删除语句前后自动执行的一堆SQL代码,通常我们使用触发器增强数据一致性所以首先我们需要修改默认分隔符DELIMITER$$CREATETRIGGERpayments_after_insert意思是这个触发器关联到付款表,并且会在我们插入一条记录以后点燃命名方法:先是明......
  • Python使用selenium库实现网页自动化登陆以及数据抓取(爬虫)教程
      相比于传统的网络请求实现爬虫,Selenium可以模拟用户在浏览器上的操作,处理由JavaScript生成的动态内容,以执行点击、滚动、表单提交等操作,模拟真实用户访问,绕过一些反爬机制,更方便的获取动态生成的网站数据。  本篇教程将采取环境搭建、自动化操作、使用cookie自动化登陆、实......
  • 数据治理--数据接入 批量接入脚本生成工具 判断增量全量,过滤
             表变化频率比较低的表覆盖     数据接入工具           ......
  • 北京Profinet转Modbus网关配置调试详解
    一、背景:在工业自动化系统中,PLC(可编程逻辑控制器)与流量计之间的通信是非常重要的,以确保数据准确传输并实现控制功能。然而,由于PLC和流量计可能采用不同的通信协议(如Profinet和Modbus),因此需要一种转换机制来实现它们之间的通信。在这种情况下,Profinet转Modbus网关成为了一个理想的......