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
  }
}

完结。

相关推荐
百锦再3 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
百锦再3 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
晚霞的不甘14 小时前
Flutter for OpenHarmony天气卡片应用:用枚举与动画打造沉浸式多城市天气浏览体验
前端·flutter·云原生·前端框架
WindrunnerMax15 小时前
从零实现富文本编辑器#11-Immutable状态维护与增量渲染
前端·架构·前端框架
竟未曾年少轻狂16 小时前
Vue3 生命周期钩子
前端·javascript·vue.js·前端框架·生命周期
Jing_Rainbow16 小时前
【React-6/Lesson89(2025-12-27)】React Context 详解:跨层级组件通信的最佳实践📚
前端·react.js·前端框架
C澒18 小时前
多场景多角色前端架构方案:基于页面协议化与模块标准化的通用能力沉淀
前端·架构·系统架构·前端框架
光影少年2 天前
react状态管理都有哪些及优缺点和应用场景
前端·react.js·前端框架
梦帮科技2 天前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
C澒2 天前
前端整洁架构(Clean Architecture)实战解析:从理论到 Todo 项目落地
前端·架构·系统架构·前端框架