由element-ui的table引发的系列问题---单元格合并

说明:

在平常的开发中,或许你也会遇到一些数据的展示,说到数据的展示可能也就少不了单元格合并的问题了。

本文将逐一将笔者遇到的问题分享出来,以便自己后续参考。最新更新时间: 2020-05-09

 

本文使用的是Vue + Element-ui 构建的项目
依赖版本:
"vue": "^2.6.10",
"element-ui": "^2.13.0"

 

阅读本文前,请先查看官方提供的合并行或列示例

 

正文:

首先,先贴一下官方提供的span-method的定义

 

 

 由于官方提供的示例比较简单,所以有时候很难直接拿过来解决开发中复杂的业务。

 笔者通过借鉴此文中的内容,并加以改善解决了这个问题

 代码:

<template>
  <div>
    <el-table
      :data="tableData"
      :span-method="spanMethod"
      border
      style="width: 100%">
      <el-table-column
        prop="id"
        label="ID"
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名">
      </el-table-column>
      <el-table-column
        prop="amount1"
        label="数值 1">
      </el-table-column>
      <el-table-column
        prop="amount2"
        label="数值 2">
      </el-table-column>
      <el-table-column
        prop="amount3"
        label="数值 3">
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data () {
    return {
      tableData: [
        {
          id: '12987122',
          name: '王小虎',
          amount1: '234',
          amount2: '3.2',
          amount3: 10
        }, {
          id: '1298712',
          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: '12987125',
          name: '张三',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }
      ],
      spanArr: [],
      position: 0,
      needSpan: ['id', 'name'], // 需要合并的属性
      spanArrObj: {
        id: [],
        name: []
      }
    }
  },
  created () {
    this.getSpanArr()
  },
  methods: {
    // 合并行方法
    spanMethod ({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        const _row = this.spanArrObj['id'][rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }
      if (columnIndex === 1) {
        const _row = this.spanArrObj['name'][rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }
    },
    // 获取合并行参数(数组)
    rowspan (prop, first = 'id') {
this.tableData.forEach((item, index) => {
        if (index === 0) {
          this.spanArrObj[prop].push(1)
          this.position = 0
        } else {
          if (this.tableData[index][first] === this.tableData[index - 1][first] && this.tableData[index][prop] === this.tableData[index - 1][prop]) {
this.spanArrObj[prop][this.position] += 1
            this.spanArrObj[prop].push(0)
          } else {
            this.spanArrObj[prop].push(1)
            this.position = index
          }
        }
      })
    },
    getSpanArr () {
      this.needSpan.forEach(item => {
        this.rowspan(item)
      })
    }
  }
}
</script>

 

效果图:

需要注意的问题:

① 如果这里不仅仅是展示数据,同时还有编辑表单的功能,那么需要在rowspan中添加以下代码来初始化合并

// 获取合并行参数(数组)
rowspan (prop) {
+  this.position = 0
+  this.spanArrObj = []
  this.tableData.forEach((item, index) => {        

② 如果数据改变但是视图无法得到更新,请在数据编辑的保存方法中添加一下代码来强制更新

this.$forceUpdate() // vue提供的方法

posted @ 2020-04-20 13:09  R_Javac  阅读(554)  评论(0编辑  收藏  举报
Live2D
干嘛呢你,快把手拿开