vue 传参合并单元格

该博客主要展示了如何在 Vue.js 应用中使用 Element UI 组件库实现表格数据的合并。通过点击按钮,可以切换显示合并后的表格。示例中涉及的数据包括年级、班级、小组和姓名,通过`objectSpanMethod`方法处理合并逻辑,确保相同年级和小组的行被合并。此外,还展示了`SpanMethod`方法用于计算合并信息。
摘要由CSDN通过智能技术生成
<template>
  <div>
    <table>
      <tr>
        <th>
          <el-button @click="showResult">合并单元格</el-button>
        </th>
      </tr>
      <tr>
        <th>
          <el-table
            :data="tableData1"
            border
            style="width: 100%; text-align: center"
          >
            <el-table-column
              v-for="(item, index) in tableTitle"
              :key="index"
              :prop="item.col"
              :label="item.name"
              :width="item.width"
              header-align="center"
            >
            </el-table-column>
          </el-table>
        </th>
        <th v-show="show">
          <el-table
            :data="tableData2"
            border
            style="width: 100%; text-align: center"
            :span-method="objectSpanMethod"
          >
            <el-table-column
              v-for="(item, index) in tableTitle"
              :key="index"
              :prop="item.col"
              :label="item.name"
              :width="item.width"
              header-align="center"
            >
            </el-table-column>
          </el-table>
        </th>
      </tr>
    </table>
  </div>
</template>

<script>
export default {
  name: "APP",
  data() {
    return {
      tableTitle: [
        {
          col: "grade",
          name: "年级",
          width: "80px",
        },
        {
          col: "clas",
          name: "班级",
          width: "80px",
        },
        {
          col: "group",
          name: "小组",
          width: "80px",
        },
        {
          col: "name",
          name: "姓名",
          width: "80px",
        },
      ],
      tableData1: [
        {
          grade: "一年级",
          clas: "二班",
          group: "一组",
          name: "张三",
        },
        {
          grade: "一年级",
          clas: "三班",
          group: "二组",
          name: "王五",
        },
        {
          grade: "一年级",
          clas: "三班",
          group: "三组",
          name: "李四",
        },
        {
          grade: "二年级",
          clas: "三班",
          group: "三组",
          name: "小明",
        },
        {
          grade: "二年级",
          clas: "一班",
          group: "三组",
          name: "花花",
        },
        {
          grade: "二年级",
          clas: "二班",
          group: "二组",
          name: "田七",
        },
        {
          grade: "二年级",
          clas: "二班",
          group: "二组",
          name: "小明",
        },
        {
          grade: "二年级",
          clas: "二班",
          group: "三组",
          name: "花花",
        },
      ],
      tableData2: [
        {
          grade: "一年级",
          clas: "二班",
          group: "一组",
          name: "张三",
        },
        {
          grade: "二年级",
          clas: "三班",
          group: "二组",
          name: "王五",
        },
        {
          grade: "一年级",
          clas: "三班",
          group: "三组",
          name: "李四",
        },
        {
          grade: "二年级",
          clas: "一班",
          group: "三组",
          name: "小明",
        },
        {
          grade: "二年级",
          clas: "一班",
          group: "三组",
          name: "花花",
        },
        {
          grade: "二年级",
          clas: "二班",
          group: "二组",
          name: "田七",
        },
        {
          grade: "二年级",
          clas: "二班",
          group: "二组",
          name: "小明",
        },
        {
          grade: "二年级",
          clas: "二班",
          group: "三组",
          name: "花花",
        },
      ],
      show: false,
      colArr: ["grade", "group"], // 有合并项的列
      arr: [],
    };
  },
  methods: {
    showResult() {
      this.show = !this.show;
    },
    //合并
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      let arr = this.arr;
      if (arr[columnIndex].length > 0) {
        if (arr[columnIndex][rowIndex] === 0) {
          return {
            rowspan: 0,
            colspan: 0,
          };
        } else {
          return {
            rowspan: arr[columnIndex][rowIndex],
            colspan: 1,
          };
        }
      }
    },
    SpanMethod(data) {
      let cot = [];
      for (let j = 0; j < this.colArr.length; j++) {
        let arr = [],
          arrcol = 0;
        arr[0] = 1;
        for (let i = 1; i < data.length; i++) {
          if (data[arrcol][this.colArr[j]] === data[i][this.colArr[j]]) {
            if (j < 1 || (j >= 1 && cot[j - 1][i] == 0)) {
              arr[arrcol]++;
              arr[i] = 0;
            } else {
              arr[i] = 1;
              arrcol = i;
            }
          } else {
            arr[i] = 1;
            arrcol = i;
          }
        }
        cot[j] = arr;
      }
      let Box = [];
      for (let i = 0; i < this.tableTitle.length; i++) {
        let col = this.colArr.indexOf(this.tableTitle[i].col);
        if (col >= 0) {
          Box[i] = cot[col];
        } else {
          Box[i] = [];
        }
      }
      return Box;
    },
  },
  created() {
    this.arr = this.SpanMethod(this.tableData2);
  },
};
</script>
<style></style>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值