elementUI的table合并行和列模板

elementUI的table合并行和列模板

最近没怎么接触elementUI的table表格的合并,研究了下行和列的合并,索性写个模板试下,也顺便记录下吧,代码和例图如下。

代码如下:

JavaScript 复制代码
<template>
  <div>
    <el-table :data="tableData" :span-method="spanMethod" border style="width: 100%">
      <!-- 第一组:固定列 -->
      <el-table-column label="列1" prop="domain" width="120" />
      <el-table-column label="列2" prop="scene" width="140" />
      <el-table-column label="列3" prop="rule" width="200" />
      <el-table-column label="列4" prop="datatype" width="200" />
      <!-- 第二组:数据 -->
      <el-table-column label="各地区数据量">
        <el-table-column label="北京">
          <template slot-scope="{row}">
            <span v-if="row.key === 'abnornum'">{{ row.beijing }}台</span>
            <span v-else>{{ row.beijing }}</span>
          </template>
        </el-table-column>
        <el-table-column label="上海">
          <template slot-scope="{row}">
            <span v-if="row.key === 'abnornum'">{{ row.shanghai }}台</span>
            <span v-else>{{ row.shanghai }}</span>
          </template>
        </el-table-column>
        <el-table-column label="广州">
          <template slot-scope="{row}">
            <span v-if="row.key === 'abnornum'">{{ row.shanghai }}台</span>
            <span v-else>{{ row.shanghai }}</span>
          </template>
        </el-table-column>
        <el-table-column label="深圳">
          <template slot-scope="{row}">
            <span v-if="row.key === 'abnornum'">{{ row.shanghai }}台</span>
            <span v-else>{{ row.shanghai }}</span>
          </template>
        </el-table-column>
        <el-table-column label="三亚">
          <template slot-scope="{row}">
            <span v-if="row.key === 'abnornum'">{{ row.shanghai }}台</span>
            <span v-else>{{ row.shanghai }}</span>
          </template>
        </el-table-column>
        <el-table-column label="重庆">
          <template slot-scope="{row}">
            <span v-if="row.key === 'abnornum'">{{ row.shanghai }}台</span>
            <span v-else>{{ row.shanghai }}</span>
          </template>
        </el-table-column>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  components: {

  },
  data() {
    return {
      tableData: [
        // 原始一条规则
        // {
        //   domain: '数据1',
        //   scene: '第二列数据',
        //   rule: '第三列数据',
        //   beijing: { eqnum: 2527, busnum: 123145, abnornum: 2.2063 },
        //   shanghai: { eqnum: 3797, busnum: 29725, abnornum: 10.9268 },
        //   guangzhou: { eqnum: 12210, busnum: 42854, abnornum: 0.3407 },
        //   shenzhen: { eqnum: 955, busnum: 13701, abnornum: 5.7222 },
        //   sanya: { eqnum: 210, busnum: 4074, abnornum: 1.7919 },
        //   chongqing: { eqnum: 201, busnum: 15305, abnornum: 1.3133 }
        // }

        // 拆成 多行 行
        {
          domain: '数据1',
          scene: '第二列数据',
          rule: '第三列数据',
          key: 'eqnum', // 这一行显示"设备数"
          datatype: "设备数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据1',
          scene: '第二列数据',
          rule: '第三列数据',
          key: 'busnum',   // 业务数
          datatype: "业务数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据1',
          scene: '第二列数据',
          rule: '第三列数据',
          key: 'abnornum',    // 异常数
          datatype: "异常数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          domain: '数据1',
          scene: '第二列数据',
          rule: '第三列数据1',
          key: 'eqnum', // 这一行显示"设备数"
          datatype: "设备数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据1',
          scene: '第二列数据',
          rule: '第三列数据1',
          key: 'busnum',   // 业务数
          datatype: "业务数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据1',
          scene: '第二列数据',
          rule: '第三列数据1',
          key: 'abnornum',    // 异常数
          datatype: "异常数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },

        {
          domain: '数据1',
          scene: '第二列数据2',
          rule: '第三列数据2',
          key: 'eqnum', // 这一行显示"设备数"
          datatype: "设备数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据1',
          scene: '第二列数据2',
          rule: '第三列数据2',
          key: 'busnum',   // 业务数
          datatype: "业务数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据1',
          scene: '第二列数据2',
          rule: '第三列数据2',
          key: 'abnornum',    // 异常数
          datatype: "异常数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },

        {
          domain: '数据11',
          scene: '第二列数据2',
          rule: '第三列数据1-1',
          key: 'eqnum', // 这一行显示"设备数"
          datatype: "设备数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据11',
          scene: '第二列数据2',
          rule: '第三列数据1-1',
          key: 'busnum',   // 业务数
          datatype: "业务数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据11',
          scene: '第二列数据2',
          rule: '第三列数据1-1',
          key: 'abnornum',    // 异常数
          datatype: "异常数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },

        {
          domain: '数据11',
          scene: '第二列数据2',
          rule: '第三列数据1-2',
          key: 'eqnum', // 这一行显示"设备数"
          datatype: "设备数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据11',
          scene: '第二列数据2',
          rule: '第三列数据1-2',
          key: 'busnum',   // 业务数
          datatype: "业务数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        },
        {
          // ...同上,
          domain: '数据11',
          scene: '第二列数据2',
          rule: '第三列数据1-2',
          key: 'abnornum',    // 异常数
          datatype: "异常数",
          beijing: 2527,
          shanghai: 3797,
          guangzhou: 12210,
          shenzhen: 955,
          sanya: 210,
          chongqing: 201
        }

      ]
    }
  },
  computed: {

  },
  methods: {
    spanMethod({ row, column, rowIndex, columnIndex }) {
      // // 只处理前 3 列
      // // 'domain', 'scene',
      // if (['rule'].includes(column.property)) {
      //   // 每 3 行合并一次
      //   if (rowIndex 台 3 === 0) {
      //     return { rowspan: 3, colspan: 1 };
      //   } else {
      //     return { rowspan: 0, colspan: 0 }; // 隐藏掉第二、三行
      //   }
      // } else if (['scene'].includes(column.property)) {
      //   // 每 6行合并一次
      //   if (rowIndex 台 9 === 0) {
      //     return { rowspan: 9, colspan: 1 };
      //   } else {
      //     return { rowspan: 0, colspan: 0 }; // 隐藏掉第二、三行
      //   }
      // } else if (['domain'].includes(column.property)) {
      //   // 每 9 行合并一次
      //   if (rowIndex 台 this.tableData.length === 0) {
      //     return { rowspan: this.tableData.length, colspan: 1 };
      //   } else {
      //     return { rowspan: 0, colspan: 0 }; // 隐藏掉第二、三行
      //   }
      // }
      // // 其余列不合并
      // return { rowspan: 1, colspan: 1 };

      // 函数处理
      if (columnIndex == 0) {
        let _row = this.fillterData(this.tableData, 'domin').one[rowIndex]
        let _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      } else if (columnIndex == 1) {
        let _row = this.fillterData(this.tableData, 'scene').one[rowIndex]
        let _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      } else if (columnIndex == 2) {
        let _row = this.fillterData(this.tableData, 'rule').one[rowIndex]
        let _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }
    },
    fillterData(arr, ele) {
      let spanOneArr = []
      let concatOne = 0
      arr.forEach((item, index) => {
        if (index == 0) {
          spanOneArr.push(1)
        } else {
          if (item[ele] === arr[index - 1][ele]) {
            spanOneArr[concatOne] += 1
            spanOneArr.push(0)
          } else {
            spanOneArr.push(1)
            concatOne = index
          }
        }
      })
      return {
        one: spanOneArr
      }
    }
  }
}
</script>

<style scoped></style>

例图如下:

相关推荐
不要试图纠正别人几秒前
别让大模型算钱:我把优惠券组合优化写成了确定性算法
前端
志尊宝几秒前
Vue3 零基础每日笔记(075):图片懒加载与骨架屏
javascript·vue.js·笔记
IT_Octopus26 分钟前
【零基础入门 LLM 开发 · Day 11】:ChatOpenAI vs init_chat_model——一行换供应商
java·前端·javascript
柚yuzumi29 分钟前
React 19 Hooks 入门:函数组件的四大法宝 (useState / useEffect / useRef / useContext)
前端·javascript·架构
deli00732 分钟前
撒下 200 个种子点,平面为什么自己长成蜂窝?Voronoi 图实验室
前端
King禅42 分钟前
JavaScript 调试实战指南:从 console.log 到 DevTools 深度运用
javascript
大文说跨境43 分钟前
多账号环境隔离方案技术选型:指纹浏览器、VPS 与云手机的三种架构对比
java·开发语言·前端
咕白m62544 分钟前
使用 C# 将 TIFF 转换为 PDF
前端·c#
全栈项目管理程序猿1 小时前
ArcGIS JS 基础教程(28):图层渲染顺序管理
前端·javascript
huakoh1 小时前
MCP 工具报错走哪条通道:三条探针的最小复现检查
前端