zoukankan      html  css  js  c++  java
  • 由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=" 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提供的方法

  • 相关阅读:
    Java 泛型,你了解类型擦除吗?
    终于有人把 Nginx 说清楚了,图文详解!
    给你一份超详细 Spring Boot 知识清单
    Java 中的 SPI 机制是什么鬼?
    用 Git 和 Github 提高效率的 10 个技巧!
    聊聊微服务架构及分布式事务解决方案!
    python多线程同步机制Lock
    python多线程同步机制Semaphore
    mysql 慢查询时间
    mysql row模式查看原始sql
  • 原文地址:https://www.cnblogs.com/ViavaCos/p/12736975.html
Copyright © 2011-2022 走看看