Element Plus 之 el-table相同行合并(通用函数),相同列合并(自行判断需合并的字段以及相应的列下标)

展示

代码

html 复制代码
<el-table :data="tableData" border style="width: 100%" :span-method="objectSpanMethod">
  <el-table-column prop="date" label="Date" width="180" align="center" />
  <el-table-column prop="name1" label="Name1" width="180" align="center" />
  <el-table-column prop="name2" label="Name2" width="180" align="center" />
  <el-table-column prop="class" label="class" width="180" align="center" />
  <el-table-column prop="address" label="Address" />
</el-table>
ts 复制代码
const tableData = ref([
  {
    date: '2016-05-04',
    name1: 'Tom',
    name2: 'Tom',
    class: '三年级一班',
    address: 'No. 189, Grove St, Los Angeles'
  },
  {
    date: '2016-05-03',
    name1: 'Tom',
    name2: 'Tom',
    class: '三年级一班',
    address: 'No. 189, Grove St, Los Angeles'
  },
  {
    date: '2016-05-02',
    name1: 'Tom',
    name2: 'Tom',
    class: '三年级一班',
    address: 'No. 189, Grove St, Los Angeles'
  },
  {
    date: '2016-05-02',
    name1: 'Tom',
    name2: 'Tom',
    class: '三年级一班',
    address: 'No. 189, Grove St, Los Angeles'
  },
  {
    date: '2016-05-01',
    name1: 'Tom',
    name2: 'Tom',
    class: '三年级一班',
    address: 'No. 189, Grove St, Los Angeles'
  }
])

const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
  let rowspan = 1,
    colspan = 1

  // 合并列
  // 自行判断哪两个字段需要合并,相同值即代表要合并
  // 并且需要自行判断当前合并字段所在的列下标,如示例中的name1的列下标为1,name2的列下标为2
  // 则把name1的列下标的colspan设为2(即占两个单元格),那么name2的列下标的colspan则必须为0,表示不占单元格
  if (row.name1 == row.name2) {
    if (columnIndex == 1) {
      colspan = 2
      rowspan = 1
    } else if (columnIndex == 2) {
      colspan = 0
      rowspan = 0
    }
  }
  
  // 合并行
  // 定义需要合并的列字段,有哪些列需要合并,就自定义添加字段即可
  const fields = ['date']
  // 当前单元格的数据
  const cellValue = row[column.property]
  // 判断只合并定义字段的列数据
  if (cellValue && fields.includes(column.property)) {
    const prevRow = tableData.value[rowIndex - 1] //上一行数据
    let nextRow = tableData.value[rowIndex + 1] //下一行数据
    // 当上一行的单元格数据等于当前行数据时,当前行单元格隐藏
    if (prevRow && prevRow[column.property] === cellValue) {
      colspan = 0
      rowspan = 0
    } else {
      // 反之,则循环判断若下一行数据等于当前行数据,则当前行开始进行合并单元格
      let countRowspan = 1 // 用于合并计数多少单元格
      while (nextRow && nextRow[column.property] === cellValue) {
        nextRow = tableData.value[++countRowspan + rowIndex]
      }
      if (countRowspan > 1) {
        rowspan = countRowspan
      }
    }
  }

  return {
    rowspan,
    colspan
  }
}

完结。

相关推荐
hoLzwEge7 小时前
Volta实战:项目级Node版本管理 + 自定义安装目录
前端框架·node.js
ndsc_d12 小时前
10分钟搭建B端SaaS数据看板:Paico+TDesign+React实战复盘
前端·人工智能·react.js·ui·前端框架·aigc·tdesign
逍遥运德1 天前
前端工程化-03:包管理NPM-package.json 和 package-lock.json 详解
前端·前端框架·前端工程化
kidding7231 天前
旋转大转盘小程序
前端·css·微信小程序·小程序·前端框架
AI行业学习2 天前
Notepad++ 官方纯净下载+完整安装教程(Windows)【2026.7.5】
开发语言·windows·python·前端框架·html·notepad++
随风一样自由2 天前
【前端+Vitest测试框架】Vitest | Playwright | WebdriverIO | Preview
前端·前端框架·可用性测试
AI行业学习2 天前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
AI行业学习3 天前
Notepad++快速下载-Notepad++下载方式【2026-7-4】
开发语言·python·前端框架·html·notepad++·html5
星栈3 天前
LiveView 的 LiveComponent:比 React 组件更轻,但我一开始真的把它用错了
前端·前端框架·elixir
随风一样自由3 天前
【前端领域】2026最新前端领域全梳理(框架/工具/AI/跨端/底层标准/就业趋势)
前端·人工智能·前端框架