vue+element实现表格合并

主要使用element-ui中的el-table中有个方法叫做span-method

通过这个方法可以实现表格行合并

实现思路;

通过对数据进行一个加工在每一条数据中加入向下合并多少的标识再通过span-method方法来实现合并

示例:

<template>
  <div>
    <!-- 表格自带方法 span-method -->
    <el-table :data="tableData" border :span-method="objectSpanMethod">
      <el-table-column label="姓名" prop="name"></el-table-column>
      <el-table-column label="爱好" prop="hosbity"></el-table-column>
      <el-table-column label="手机号" prop="tel"></el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        {
          userId: "1",
          name: "张森",
          hosbity: "打篮球",
        },
        {
          userId: "1",
          name: "张森",
          hosbity: "唱歌",
        },
        {
          userId: "1",
          name: "张森",
          hosbity: "嘻哈",
        },
        {
          userId: "2",
          name: "三木",
          hosbity: "唱歌",
        },
        {
          userId: "2",
          name: "三木",
          hosbity: "打篮球",
        },
        {
          userId: "3",
          name: "木子",
          hosbity: "唱歌",
        },
        {
          userId: "4",
          name: "左进",
          hosbity: "唱歌",
        },
        {
          userId: "4",
          name: "左进",
          hosbity: "rap",
        },
        {
          userId: "4",
          name: "左进",
          hosbity: "打篮球",
        },
      ],
    };
  },
  components: {},
  computed: {},

  //方法集合
  methods: {
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        return row.spanObj;
      }
    },
  },
  mounted() {
    //我设置的数据是否合并的标识是userId  这里可以根据实际情况 做调整

    let flag = 0; //标记第一个
    let i = 0; //标记需要合并几行
    this.tableData.forEach((item, index, arr) => {
      //默认每行都和并没有了 00
      item.spanObj = {
        rowspan: 0,
        colspan: 0,
      };
      // 判断是不是第一个 如果是第一个记录flag 默认合并一个
      if (index - 1 < 0 || item.userId != arr[index - 1].userId) {
        flag = index;
        i = 1;
      }
      // 判断这一个跟上一个是不是一样  如果一样 那么就i++
      if (arr[index - 1] && item.userId == arr[index - 1].userId) {
        i++;
      }
      // 判断到头了吗 如果下一个areaId不存在 获取是现在这个跟下一个areaId不一样了那就给你一个赋值
      if (!arr[index + 1] || item.userId != arr[index + 1].userId) {
        arr[flag].spanObj = {
          rowspan: i,
          colspan: 1,
        };
      }
    });
  },
};
</script>

实现点击合并表格数据,需要使用 Element UI 提供的表格组件和相关 API。以下是一个基本的实现方法: 1. 定义表格的数据格式,包括表头和内容。 2. 在表格组件使用 `table-row-class-name` 属性来设置行的样式名。这个属性接受一个函数,函数的参数为当前行的数据对象,返回值为这一行的样式名。 3. 在样式名函数,根据当前行的数据对象判断是否需要和前一行合并,如果需要合并,则返回一个特定样式名。 4. 使用 `span-method` 属性来定义合并单元格的方法。这个属性接受一个函数,函数的参数为当前单元格的行列信息,返回值为一个包含 `rowspan` 和 `colspan` 属性的对象,用于指定合并的行数和列数。 下面是一个示例代码: ```html <template> <el-table :data="tableData" :row-class-name="rowClassName" :span-method="spanMethod"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <<el-table-column prop="gender" label="性别"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20, gender: '男' }, { name: '李四', age: 22, gender: '男' }, { name: '王五', age: 22, gender: '女' }, { name: '赵六', age: 25, gender: '女' }, ], }; }, methods: { rowClassName(row, index) { if (index > 0 && row.gender === this.tableData[index - 1].gender) { // 如果和前一行性别相同,则需要合并 return 'merge-row'; } return ''; }, spanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 2 && rowIndex > 0 && row.gender === this.tableData[rowIndex - 1].gender) { // 如果是第三列,并且和前一行性别相同,则需要合并 return { rowspan: 0, colspan: 0 }; } }, }, }; </script> <style> .merge-row td:nth-child(3) { /* 第三列需要合并 */ border-top-width: 0 !important; /* 去掉上边框 */ } </style> ``` 在上面的代码,我们定义了一个表格,包含三列:姓名、年龄、性别。然后,我们使用 `row-class-name` 属性来设置行的样式名,如果一行需要和前一行合并,则返回一个特定样式名。在样式,我们设置第三列的单元格不显示上边框。最后,我们使用 `span-method` 属性来定义合并单元格的方法,如果一个单元格需要合并,则返回一个包含 `rowspan` 和 `colspan` 属性的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zWoods

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值