相关文章推荐
重感情的包子  ·  Application.OnKey 方法 ...·  1 年前    · 
慈祥的佛珠  ·  如何在Android推流端内置轻量级RTSP ...·  1 年前    · 
多情的仙人球  ·  【docx4j】docx4j操作docx,实 ...·  1 年前    · 
温柔的茴香  ·  迪拜义乌小商品城今开业,入驻企业可享受货物转 ...·  1 年前    · 
彷徨的马铃薯  ·  Qt学习总结(C鱼)之QList和QMap容 ...·  1 年前    · 
Code  ›  element-ui中el-table的跨行,合并行计算方式开发者社区
社区功能 单元格 rowspan
https://cloud.tencent.com/developer/article/1965252
活泼的冲锋衣
11 月前
拿我格子衫来

element-ui中el-table的跨行,合并行计算方式

原创
前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
拿我格子衫来
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > element-ui中el-table的跨行,合并行计算方式

element-ui中el-table的跨行,合并行计算方式

原创
作者头像
拿我格子衫来
发布 于 2022-03-28 16:16:00
3.9K 0
发布 于 2022-03-28 16:16:00
举报
文章被收录于专栏: TopFE TopFE

背景

在最近的一个迭代上,有一个功能点是在表格中做一个合并单元格的效果。大致如下图

在这里插入图片描述
在这里插入图片描述

只有第一列合并行,跨行。合并的规则是纵向相邻的连续N行,如果id一致,则合并。

看到这个需求一开始我以为很简单,表格跨行.跨列,不就是设置 rowspan 和 colspan 。于是我就把这个功能点放到最后来实现了。

等到真正去做的时候,查了一下element的文档,发现并没那么简单。需要自己动手去写一个方法设置每个单元格的rowspan和 colspan。 眼看要提测了,想偷懒的想借他山之石。于是在前端群里问了一下,又没人写过类似的,解决一下。后来想想真是多此一举,关键时刻一定要相信自己。何况很久没有遇到有意思的题目了。看起来很有趣。在前端群里得到否定答案的我,决定加班好好研究一下这个合并的规则。为他人铺一个康庄大道。

认真研究

以下是官方提供的一个在第一列合并行的例子

代码语言: javascript
复制
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
  if (columnIndex === 0) {
    if (rowIndex % 2 === 0) {
      return {
        rowspan: 2,
        colspan: 1,
    } else {
      return {
        rowspan: 0,
        colspan: 0,
}

在 el-table 标签上设置 :span-method="objectSpanMethod" 就能实现在第一列的偶数行被合并。这个例子写的很简单。没有掺杂任何业务逻辑。该方法返回的数据可以是 一个包含rowspan和colspan的对象。 {rowspan: 2, colspan: 1} 表示当前单元格占用二行一列。 {rowspan: 0, colspan: 0} 表示当前单元格缺少,或被合并了。

row表示当前行。column表示当前列,rowIndex当前行的索引,columnIndex 当前列的索引。

在日常开发中,常见的合并行,或合并列的场景是根据后端返回的一个数组,依据其中的某一个属性来合并行。比如有一个表格,统计每个人车辆的所属情况。后端是以车辆为粒度返回数据。当一个人有多台车时,(比如我)就需要将姓名那一列合并行。这样做后,信息的层次和结构会更加清晰。表现得更加具体,形象。

思路实现

根据合并的规则可以知道,在我的需求中,只需要确定rowspan的值即可。也就是合并多少行,对于被合并的单元格,rowspan和colspan都为零。而合并的单元格,他的colspan为1,因为它不跨列。

于是拿到表格数据后,对表格数据进行以下处理。假设要合并的字段为 runPeriod 。相同的runPeriod单元格合并起来。

代码语言: javascript
复制
addSpanRows(tableData) {
  let pos = 0
  let len = tableData.length
  for (let i = 0; i < len; i++) {
    const item = tableData[i]
    if (i === 0) {
      item.$rows = 1
      pos = 0
    if (i !== 0) {
      if (item.runPeriod === tableData[i - 1].runPeriod) {
        item.$rows = 0
        tableData[pos].$rows = tableData[pos].$rows + 1
      } else {
        item.$rows = 1
        pos = i
}

使用pos记录出现重复的元素的索引,找到一个重复后就将索引为pos的记录的 $rows 加1,找不到就将pos设置为当前遍历的索引

在

代码语言: javascript
复制
spanMethod({row, _, __, columnIndex}) {
  if (columnIndex === 0) {
 
推荐文章
重感情的包子  ·  Application.OnKey 方法 (Excel) | Microsoft Learn
1 年前
慈祥的佛珠  ·  如何在Android推流端内置轻量级RTSP服务 - 知乎
1 年前
多情的仙人球  ·  【docx4j】docx4j操作docx,实现替换内容、转换pdf、html等操作 - QiaoZhi - 博客园
1 年前
温柔的茴香  ·  迪拜义乌小商品城今开业,入驻企业可享受货物转口零关税_中国_小商品市场_分市场
1 年前
彷徨的马铃薯  ·  Qt学习总结(C鱼)之QList和QMap容器类_51CTO博客_qmap qlist
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号