TDesign组件库+vue3+ts 如何视觉上合并相同内容的table列?(自定义合并table列)

背景

当table的某一列的某些内容相同时,需要在视觉上合并这一部分的内容为同个单元格
合并张三
如上图所示,比如需要合并当申请人为同个字段的列。

解决代码

<t-table
      :data="filteredData"
      :columns="columns"
      :rowspan-and-colspan="rowspanAndColspanMethod"
      row-key="id"
    >
    </t-table>
    
function rowspanAndColspanMethod({ col, rowIndex }) {
  if (col.colKey === 'name') { // 这里需要获取的是需要合并的列的名字
    const currentName = filteredData.value[rowIndex].name;
    let rowspan = 1;
    for (let i = rowIndex + 1; i < filteredData.value.length; i++) {
      if (filteredData.value[i].name === currentName) {
        rowspan++;
      } else {
        break;
      }
    }
    return { rowspan };
  }
  return {};
}

在 rowspanAndColspanMethod 函数中,添加对 name 列的处理。

  • 如果 col.colKey === ‘name’,则获取当前行的 name 的 currentName。
  • 使用一个 for循环从当前行的下一行开始,检查后续行的 Name 是否与 currentName 相同。
  • 如果相同,则增加 rowspan 计数器。
  • 如果不同,则停止循环。 返回包含 rowspan 的对象。

通过这种方式,当 name 相同时,它们将在视觉上合并为同一个单元格。

要实现动态合并,可以使用 Element Plus 表格组件提供的 `span-method` 属性。该属性可以设置一个方法,用于动态计算每个单元格需要合并的行数和数。 下面是一个示例代码,使用 TypeScript 和 Element Plus 表格组件实现动态合并: ```typescript <template> <el-table :data="tableData" :span-method="mergeCell" > <el-table-column prop="name" label="名称" /> <el-table-column prop="age" label="年龄" /> <el-table-column prop="gender" label="性别" /> <el-table-column prop="score" label="分数" /> </el-table> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { ElTableColumn, ElTableRow } from 'element-plus'; export default defineComponent({ data() { return { tableData: [ { name: '张三', age: 18, gender: '男', score: 90, }, { name: '李四', age: 20, gender: '女', score: 85, }, { name: '王五', age: 22, gender: '男', score: 95, }, ], }; }, methods: { mergeCell({ row, column, rowIndex, columnIndex }: { row: Record<string, any>; column: ElTableColumn; rowIndex: number; columnIndex: number; }): { rowspan: number; colspan: number; } { // 判断第一是否相同 if (columnIndex === 0) { let rowspan = 1; for (let i = rowIndex + 1; i < this.tableData.length; i++) { if (this.tableData[i].name === row.name) { rowspan++; } else { break; } } return { rowspan, colspan: 1, }; } // 其他不需要合并 return { rowspan: 0, colspan: 0, }; }, }, }); </script> ``` 在上面的代码中,`mergeCell` 方法会接收一个参数,包含当前单元格的行数据、数据、行索引和索引。通过判断第一的值是否相同,动态计算需要合并的行数和数,然后返回一个对象。 需要注意的是,`span-method` 属性的值是一个函数,需要使用 `defineComponent` 方法定义组件,并将该函数作为组件的一个方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值