Vue 学习随笔系列十三 -- ElementUI 表格合并单元格

ElementUI 表格合并单元格

### 文章目录

  • [ElementUI 表格合并单元格](#文章目录 ElementUI 表格合并单元格 @TOC 一、表头合并 二、单元格合并 1、示例代码 2、示例效果)
  • [@[TOC](文章目录)](#文章目录 ElementUI 表格合并单元格 @TOC 一、表头合并 二、单元格合并 1、示例代码 2、示例效果)
  • [一、表头合并](#文章目录 ElementUI 表格合并单元格 @TOC 一、表头合并 二、单元格合并 1、示例代码 2、示例效果)
  • [二、单元格合并](#文章目录 ElementUI 表格合并单元格 @TOC 一、表头合并 二、单元格合并 1、示例代码 2、示例效果)
  • [1、示例代码](#文章目录 ElementUI 表格合并单元格 @TOC 一、表头合并 二、单元格合并 1、示例代码 2、示例效果)
  • [2、示例效果](#文章目录 ElementUI 表格合并单元格 @TOC 一、表头合并 二、单元格合并 1、示例代码 2、示例效果)

一、表头合并

参考: https://www.jianshu.com/p/2befeb356a31

二、单元格合并

1、示例代码

bash 复制代码
<template>
  <div>
    <el-table
      size="small"
      border
      class="custom-tab"
      :data="tableBody"
      :span-method="objectMergeMethod"
      :cell-style="columnStyle"
      :row-class-name="rowStyle"
      :header-cell-style="{
        background: '#87CEFA',
        color: '#38434F',
        fontWeight: '500',
        fontSize: '14px',
      }"
    >
    
      <!-- <el-table-column type="index" label="序号" width="58" align="center"></el-table-column> -->
      <el-table-column prop="type" label="姓名" align="center" width="140px"></el-table-column>
      <el-table-column prop="name" label="科目" align="center"></el-table-column>
      <el-table-column prop="sysData" label="成绩" align="center"></el-table-column>
      <el-table-column prop="contractData" label="排名" align="center"></el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  props: {
    DiffData: {},
    isShowOpr: {
      default: false
    },
  },
  data() {
    return {
      // 表体数据
      tableBody: [
        {
          type: "小明",
          name: "语文",
          sysData: 10,
          contractData: "1",
          isDiff: "是",
          fhsj: "",
        },
        {
          type: "小明",
          name: "数学",
          sysData: 20,
          contractData: "2",
          isDiff: "是"
        },
        {
          type: "小明",
          name: "英语",
          sysData: 30,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小明",
          name: "地理",
          sysData: 30,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小明",
          name: "生物",
          sysData: 30,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小李",
          name: "语文",
          sysData: 88,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小李",
          name: "数学",
          sysData: 44,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小李",
          name: "英语",
          sysData: 44,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小李",
          name: "历史",
          sysData: 44,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小李",
          name: "生物",
          sysData: 44,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小王",
          name: "语文",
          sysData: 1001,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小王",
          name: "数学",
          sysData: 1001,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小王",
          name: "英语",
          sysData: 1001,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小王",
          name: "地理",
          sysData: 1001,
          contractData: "1",
          isDiff: "是"
        },
        {
          type: "小王",
          name: "生物",
          sysData: 1001,
          contractData: "1",
          isDiff: "是"
        },
      ],
      cellList: [], // 单元格数组
      count: null, // 计数
    };
  },
  watch: {
    tableBody: {
      immediate: true,
      deep: true,
      handler() {
        this.computedColumns(this.tableBody)
      },
    },
  },
  // mounted() {
  //   // 第1步,根据表体信息,计算合并单元格的信息
  //   this.computedColumns(this.DiffData);
  // },
  methods: {
    columnStyle({row, column, rowIndex, columnIndex}) {
      if(columnIndex === 0) {
        // 表头样式
        // return "background: #F5F6FA; color: #171A23; font-weight: 500; font-size: 14px; ";
        if(row.type == '小明') {
          return 'row-m1'
        } else if(row.type == '小李') {
          return 'row-m2'
        } else if(row.type == '小王') {
          return 'row-m3'
        } else if(row.type == 'xxx') {
          return 'row-m4'
        }
      }
    },
    rowStyle({ row, rowIndex }) {
      if(row.type == '小明') {
        return 'row-m1'
      } else if(row.type == '小李') {
        return 'row-m2'
      } else if(row.type == '小王') {
        return 'row-m3'
      } else if(row.type == 'xxx') {
        return 'row-m4'
      }
      // 指定行或列信息样式
      // if(rowIndex === 7) {
      //   return 'target-row'
      // }
    },
    // 第1步,遍历表格数据
    computedColumns(tableBody) {
      // 循环遍历表体数据
      for (let i = 0; i < tableBody.length; i++) {
        if (i == 0) {
          // 先设置第一项,往 cellList 中追加 1, 若下一项与当前项相同,则往 cellList中追加 0 
          // count 初始值为 0 
          this.cellList.push(1); 
          this.count = 0; 
          // console.log("索引", 0, this.count);
        } else {
          // 判断当前项与上一项的类别(type)是否相同,若相同则合并这一列的单元格
          if (tableBody[i].type == tableBody[i - 1].type) {
            // 如果相同, this.cellList 增加计数 1 ,并向数组追加数据 0
            this.cellList[this.count] += 1; 
            this.cellList.push(0); 
            // console.log("索引", this.count);
          } else {
            // 如果不同,往cellList数组中追加 1,并将索引赋值给 count
            this.cellList.push(1); 
            this.count = i; 
            // console.log("索引", this.count);
          }
        }
      }
    },
    // 第2步,将计算好的结果返回给el-table,表格会根据结果做出对应合并列渲染
    objectMergeMethod({ row, column, rowIndex, columnIndex }) {
      // 给第一列做单元格合并。0 是第一列,1 是第二列。
      if (columnIndex === 0) {
        const rowCell = this.cellList[rowIndex];
        if (rowCell > 0) {
          const colCell = 1;
          return {
            rowspan: rowCell,
            colspan: colCell,
          };
        } else {
          // 清除所有单元格数据,防止动态数据出现表格偏移现象
          return {
            rowspan: 0,
            colspan: 0,
          };
        }
      }
    },
  },
};
</script>

<style lang="scss" scoped>
  .vueWrap {
    .custom-tab {
      margin: 0 0 20px 0;
    }
  }
  .data-box {
    display: flex;
    align-items: center;
    justify-content: center;
    .icon {
      height: 7px;
      width: 7px;
      background-color: '#333';
      margin: 0 2px 0 0;
    }
  }
  ::v-deep .el-table--enable-row-transition .el-table__body td.el-table__cell {

  }

  ::v-deep .target-row {
    color: #3363FF;
    font-weight: 500;
  }

  ::v-deep .row-m1 {
    background-color: #BBFFFF;
    color: #333;
  }
  ::v-deep .row-m2 {
    background-color: #FFF8DC;
    color: #333;
  }
  ::v-deep .row-m3 {
    background-color: #F0FFF0;
    color: #333;
  }
  ::v-deep .row-m4 {
    background-color: #E0EEE0;
    color: #333;
  }
  .update-btn {
    color: #4597EB;
    cursor: pointer;
  }
</style>

2、示例效果

相关推荐
hopetomorrow14 分钟前
学习路之压力测试--jmeter安装教程
学习·jmeter·压力测试
hopetomorrow15 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
533_36 分钟前
[vue] 深拷贝 lodash cloneDeep
前端·javascript·vue.js
/**书香门第*/43 分钟前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d
美式小田1 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
ZBY520311 小时前
【Vue】 npm install amap-js-api-loader指南
javascript·vue.js·npm
猫爪笔记1 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
-一杯为品-2 小时前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
风尚云网3 小时前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网