vue3 结合element-plus组件库使用table进行合并行

需求 比如:

image.png

个人查看element-plus文档,去结合使用 [链接](Table 表格 | Element Plus (element-plus.org))

element文档中有“合并行或列”的例子: 多行或多列共用一个数据时,可以合并行或列。

通过给 table 传入span-method方法可以实现合并行或列, 方法的参数是一个对象,里面包含当前行 row、当前列 column、当前行号 rowIndex、当前列号 columnIndex 四个属性。 该函数可以返回一个包含两个元素的数组,第一个元素代表 rowspan,第二个元素代表 colspan。 也可以返回一个键名为 rowspan 和 colspan 的对象;

话不多说,上代码!

import type { TableColumnCtx } from 'element-plus';
//举例数据格式
const data = [
    {
        userName: "营业收费系统",
        value1: "中国农业银行",
        value2: "2022-03",
        detectionTime: "2022-03-04",
    },
    {
        userName: "营业收费系统",
        value1: "中国农业银行",
        value2: "2022-03",
        detectionTime: "2022-03-04",
    },
    {
        userName: "营业收费系统",
        value1: "中国农业银行",
        value2: "2022-03",
        detectionTime: "2022-03-04",
    },
    {
        userName: "营业收费系统",
        value1: "中国农业银行",
        value2: "2022-03",
        detectionTime: "2022-03-04",
    }
 ];
 
//需要判断的属性组
const spanProps = ['userName', 'detectionTime'];

let rowSpansMap = new Map(); //存需要开始合并的行号,向下合并多少行

/**
 * 根据列表数据得出需要合并的行
 * @param data 列表数据
 */
const spanPropGroup = (data: any) => {
  let oldRow: any = null; //需要合并的行
  rowSpansMap = new Map(); //重置Map

  oldRow = data[0]; //默认第0行为需要合并的行
  rowSpansMap.set(0, 1); //第0行,向下合并一行(其实就是自己单独一行)
  let spanRow = 0; //记录需要开始合并的行号
  for (let i = 1; i < data.length; i++) {
    const item = data[i];
    let isSame = true;
    //遍历需要判断的属性判断对应值是否全部相等
    for (let j = 0; j < spanProps.length; j++) {
      const prop = spanProps[j];
      //只要有一个属性值不相等则记录新的需要合并的行号
      if (item[prop] != oldRow[prop]) {
        oldRow = item;
        rowSpansMap.set(i, 1);
        spanRow = i;
        isSame = false;
        break;
      }
    }
    //如果所有属性值相同则所需要合并的行数+1
    if (isSame) {
      let span = rowSpansMap.get(spanRow);
      rowSpansMap.set(spanRow, span + 1);
    }
  }
};

const objectSpanMethod: any = ({ row, column, rowIndex, columnIndex }) => {
  //采样值1-5列所对应的行不需要合并
  if (columnIndex != 3 && columnIndex != 4) {
    //根据当前行号从map中获取开始合并的行根据当前行号从map中获取开始合并的行号,向下合并多少行
    const span = rowSpansMap.get(rowIndex);
    if (span != null) {
      return {
        rowspan: span, //向下合并span行
        colspan: 1,
      };
    } else {
      return {
        rowspan: 0,
        colspan: 0,
      };
    }
  }
};
//进行传递数据
spanPropGroup(data);
<template>
    <el-table
        :data="data"
        border
        :span-method="objectSpanMethod"
    >
        <el-table-column type="selection" width="55" />
        <el-table-column label="#" width="60" prop="">
            <template #default="{ $index }">
                {{ $index + 1 }}
            </template>
        </el-table-column>
        <el-table-column
            label="指标组合名称"
            align="center"
            prop="userName"
            show-overflow-tooltip
        />
        <el-table-column
            label="已使用使用指标"
            align="center"
            prop="value1"
            show-overflow-tooltip
        />
        <el-table-column
            label="权重"
            align="center"
            prop="value2"
            show-overflow-tooltip
        />
        <el-table-column
            label="计算状态"
            align="center"
            prop="detectionTime"
            show-overflow-tooltip
        /> 
        <el-table-column label="操作" width="160" resizable>
            <template #default="scope">
                <el-buttontype="text">删除</el-button>
            </template>
       </el-table-column>
    </el-table>
</template>

这样的效果就达到想要的需求了,细心观察一下代码!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现动态合并列,可以使用 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` 方法定义组件,并将该函数作为组件的一个方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值