el-table相同数据行单元格合并

本文介绍了如何在使用Vue.js和ElementUI的项目中,通过计算合并行号和编写合并方法,实现el-table中相同数据行的单元格合并。详细步骤包括绘制表格、计算并存储合并行号、编写行号合并方法。在组件mounted阶段计算合并行号数组,并通过span-method处理行合并。作者希望有更优的实现方案,并提供了简化后的完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

项目中列表第一列是名称,需要实现的效果是相同名称的行合并,如图所示:合并示例

实现步骤

1.绘制el-table

按照常规的写法绘制一个表格,根据官方文档 element-ui 介绍编写表格合并规则方法。
代码示例中的 span-method

    <el-table v-loading="listLoading" :data="list" :span-method="objectSpanMethod" >
      <el-table-column prop="name" label="name" width="120"></el-table-column>
      <el-table-column prop="Title" label="Title" width="120"></el-table-column>
      <el-table-column prop="Pageviews" label="Pageviews" width="120" align="center"> </el-table-column>
      <el-table-column prop="Status" label="Status" width="110"> </el-table-column>
      <el-table-column prop="created_at" label="Display_time" width="200"></el-table-column>
    </el-table>

2.编写合并方法

2.1 计算合并的行号

  1. 在data中定义全局变量indexArray 存储所有合并的行号;
  2. 通过传入行号及该行名称,遍及计算该行下方数据相同的行数
  methods: {
    getRows(rowIndex, name) {
      let count = 0
      for (let i = rowIndex; i < this.list.length; i++) {
        if (this.list[i].name === name) {
          count++
        } else {
          break
        }
      }
      return count
    }
  }

2.2 计算合并行号数组indexArray

在组件mounted构建时计算合并行号数组indexArray

  let count = 0
  for (let rowIndex = 0; rowIndex < this.list.length; ) {
    this.indexArray.push(rowIndex)
    count = this.getRows(rowIndex, this.list[rowIndex].name)
    rowIndex += count
  }

其中,list是整个table的数据来源

2.3 编写行号合并方法

当该行的rowIndex在合并行号数组中时返回合并行数据,否则返回空。

  methods: {
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        let rowCount = 0
        if (this.indexArray.includes(rowIndex)) {
          rowCount = this.getRows(rowIndex, row.name)
          return {
            rowspan: rowCount,
            colspan: 1
          }
        } else {
          return {
            rowspan: 0,
            colspan: 0
          }
        }
      }
    }
  }

(作者碎碎念)官网也是通过行号来控制合并,我一开始总是想用列表的属性值判断,但是每每都会陷入无限循环的困境,这种实现方式不算好,如果大佬有更好的实现方式欢迎评论,小弟不胜感激!!!

3.全部代码

项目代码不方便公开,这是我简化后的一个完整的实现代码:

<template>
  <div class="app-container">
    <el-table :data="list" :span-method="objectSpanMethod">
      <el-table-column prop="name" label="name" width="120" />
      <el-table-column prop="title" label="Title" width="120" />
      <el-table-column prop="pageviews" label="Pageviews" width="120" />
      <el-table-column prop="status" label="Status" width="110" />
      <el-table-column prop="display_time" label="Display_time" width="200" />
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [
        {
          name: '张三',
          title: '文本一',
          status: 'published',
          display_time: '2023-07-14',
          pageviews: 200
        },
        {
          name: '李四',
          title: '文本二',
          status: 'published',
          display_time: '2023-07-14',
          pageviews: 200
        },
        {
          name: '李四',
          title: '文本三',
          status: 'published',
          display_time: '2023-07-14',
          pageviews: 200
        },
        {
          name: '王五',
          title: '文本四',
          status: 'published',
          display_time: '2023-07-14',
          pageviews: 200
        },
        {
          name: '王五',
          title: '文本五',
          status: 'published',
          display_time: '2023-07-14',
          pageviews: 200
        },
        {
          name: '王五',
          title: '文本六',
          status: 'published',
          display_time: '2023-07-14',
          pageviews: 200
        }
      ],
      indexArray: []
    }
  },
  mounted() {
    let count = 0
    for (let rowIndex = 0; rowIndex < this.list.length; ) {
      this.indexArray.push(rowIndex)
      count = this.getRows(rowIndex, this.list[rowIndex].name)
      rowIndex += count
    }
  },
  methods: {
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        let rowCount = 0
        if (this.indexArray.includes(rowIndex)) {
          rowCount = this.getRows(rowIndex, row.name)
          return {
            rowspan: rowCount,
            colspan: 1
          }
        } else {
          return {
            rowspan: 0,
            colspan: 0
          }
        }
      }
    },
    getRows(rowIndex, name) {
      let count = 0
      for (let i = rowIndex; i < this.list.length; i++) {
        if (this.list[i].name === name) {
          count++
        } else {
          break
        }
      }
      return count
    }
  }
}
</script>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值