el-table复杂合并行操作

需求如下图:
图片说明

使用el-table一顿操作猛如虎,发现官网文档写的不知道是些啥,demo也让人有点摸不着头脑,看了网上的一些合并表格的例子,都没怎么看懂,于是在此捋一下自己的思路。

首先分析这样的表格应该如何处理,这里是比较简单的合并某几项数据中某几列,因此要对比出当前数据中有几项的某个值是相同的,这里拿name举例,解析步骤:

①遍历表格数据,用一个变量(此例为spanArr)记录每一行的rowspan和colspan
②判断前后两项的name相同,后面那一项的rowspan和colspan都设为0
③找到name相同的第一项,rowspan值+1
④前后不相同的项rowspan和colspan设置默认值

这个例子应对的业务需要后端配合将相同数据排列至一起,如果数据不按顺序排列,就需要先对数据进行重新排列,然后再使用这种方式去合并就可以了,具体代码如下:

<template>
  <div class="inventoryTable">
    <el-table
        :data="tableData"
        :span-method="mergeTableSpanMethod"
        border
        style="width: 100%">
      <el-table-column
          type="selection"
          width="55">
      </el-table-column>
      <el-table-column
          prop="id"
          label="原料编号"
          width="180">
      </el-table-column>
      <el-table-column
          prop="name"
          label="提醒">
      </el-table-column>
      <el-table-column
          prop="name"
          label="原料名称">
      </el-table-column>
      <el-table-column
          prop="amount2"
          label="原料类型">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="单位">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="规格">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="库存总量">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="冻结库存">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="可用库存">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="安全库存">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="入库均价">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="入库成本">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="市价值">
      </el-table-column>
      <el-table-column
          prop="amount3"
          width="150"
          label="库存成本总额">
      </el-table-column>
      <el-table-column
          prop="amount3"
          label="库存总额">
      </el-table-column>
      <el-table-column
          prop="amount3"
          width="150"
          label="生产日期">
      </el-table-column>
      <el-table-column
          prop="amount3"
          width="150"
          label="到期提醒">
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
  export default {
    name: "inventoryTable",
    data() {
      return {
        spanArr: [], // 存放表格日期单元格的rowspan和colspan信息
        tableData: [{ // 表数据
          id: '12987122',
          name: '王小虎',
          amount1: '234',
          amount2: '3.2',
          amount3: 10
        }, {
          id: '12987123',
          name: '王小虎',
          amount1: '165',
          amount2: '4.43',
          amount3: 12
        }, {
          id: '12987124',
          name: '王小虎',
          amount1: '324',
          amount2: '1.9',
          amount3: 9
        }, {
          id: '12987125',
          name: '王小虎',
          amount1: '621',
          amount2: '2.2',
          amount3: 17
        }, {
          id: '12987126',
          name: '张晓松',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }, {
          id: '12987126',
          name: '张晓松',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }, {
          id: '12987126',
          name: '张晓松',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }]
      }
    },
    mounted() {
      this.spanArr = this.getSpanData();
    },
    methods: {
      // 遍历分析表格数据 记录每一行的rowspan和colspan
      getSpanData() {
        let spanArr = [];
        for (let i = 0; i < this.tableData.length; i++) {
          let obj = {};
          if (i === 0) {
            // 第一项直接设置默认的值
            obj.rowspan = 1;
            obj.colspan = 1;
            spanArr.push(obj);
          } else {
            if (this.tableData[i].name === this.tableData[i - 1].name) {
              // 前后两项的name相同 后面那一项rowspan和colspan都设置为0
              obj.rowspan = 0;
              obj.colspan = 0;
              spanArr.push(obj);

              // 找到name相同项中第一项 rowspan值加1
              let index = this.tableData.findIndex((item) => item.name === this.tableData[i].name);
              ++spanArr[index].rowspan;
            } else {
              // 前后不相同 一个新的值 设置默认值就好
              obj.rowspan = 1;
              obj.colspan = 1;
              spanArr.push(obj);
            }
          }
        }
        return spanArr;
      },

      // 合并表格
      mergeTableSpanMethod({row, column, rowIndex, columnIndex}) {
        // row:行对象,带有一行所有数据,column:列对象
        // rowIndex:行索引,columnIndex:列索引
        // 加载表格时从(0,0)开始,(0,1)···(1,0),(1,1)···依次获取数据

        // 需要合并行的列都列出来
        if (columnIndex === 1 || columnIndex === 3 || columnIndex === 4 || 
        columnIndex === 5 || columnIndex === 6 || columnIndex === 7 || 
        columnIndex === 8 || columnIndex === 10 || columnIndex === 13) {
          let rowspan = this.spanArr[rowIndex].rowspan;
          let colspan = this.spanArr[rowIndex].colspan;
          return {rowspan, colspan};
        }
      },

    }
  }
</script>

<style scoped>

</style>
全部评论

相关推荐

暑期是进不了大厂了想问问前端友友们&nbsp;,后面应该如何沉淀自己,我想秋招再冲一下尤其是八股,应该抓哪一块是重点,理解到什么程度呢,要学到什么深度才能抗住拷打。还有场景题如何去准备。期待友友们的解答。
命烈焰带我飞走:找个中厂小厂先看看吧,去了熟悉熟悉项目,简历上扒点东西,之后刷刷sobb上百度美团快手的日常实习,流程都比较快轮次也少,别给自己太大压力,一步一步来,先不用想着暑期,转正,秋招那些事情,另外如果可能的话可以关注下面试时候的形象,穿搭,环境这些,其实实习主要就是看个眼缘,看着好看声音好听其实加分不少..八股这些不要死记硬背,挨个拿去问问chatgpt,这个东西做出来是为了解决什么问题,有啥效果,自己有想法有个模糊的概念就可以了,人家也知道你是学生,实习生没有什么kpi,放你去面都是希望能把你招进去的,场景题算法题没做过你可以边试着写边跟面试官说你的想法思路,也可以直说没见过让他们给你提示,反正最后都是与或非顺序分支循环存取值那套。总之建议是别为了秋招..出去旅旅游放松放松,少投几家少背八股多写写代码
点赞 评论 收藏
分享
03-29 19:11
门头沟学院 Java
wyp_davis:是可以这样的,不过只要交钱就是假的
点赞 评论 收藏
分享
劝退式:感觉有人回才是不正常的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务