详解关于表格合并span-method方法的补充(表格数据由后台动态返回)


Posted in Javascript onMay 21, 2019

之前写了一些关于element-ui表格合并的方法,不过用的数据都是确定的数据(死数据),但是很多时候我们的数据都是通过后台获得的,数据不稳定,这个时候使用表格合并就需要先处理一下数据,先看一下一种很常见的数据展示场景

详解关于表格合并span-method方法的补充(表格数据由后台动态返回)

直接上代码,HTML代码就不放了,都是差不多的,下面另一种场景有

// 模拟后台返回的值
  getTable () {
   this.tableData = [{
    id: 1,
    region: '中国',
    type: [{
     sortName: '器械',
     sortList: [{
      name: '器械1'
     }, {
      name: '器械2'
     }]
    }, {
     sortName: '软件',
     sortList: [{
      name: '软件1'
     }, {
      name: '软件2'
     }, {
      name: '软件3'
     }]
    }]
   }, {
    id: 2,
    region: '美国',
    type: [{
     sortName: '器械',
     sortList: [{
      name: '器械1'
     }, {
      name: '器械2'
     }]
    }, {
     sortName: '软件',
     sortList: [{
      name: '软件1'
     }, {
      name: '软件2'
     }]
    }]
   }]
   this.dealTable()
  },

  // 处理表格数据
  dealTable () {
   let getDate = [] // 存储新表格数据
   let typeIndex = [0] // 保存id,地区需要合并的值
   let nameIndex = [0] // 保存类型需要合并的值
   let a // id,地区需要合并的行是所有类型的长度
   this.tableData.forEach((v, index) => {
    if (v.type && v.type.length) {
     a = 0
     v.type.forEach((subV, i, typeData) => {
      if (subV.sortList && subV.sortList.length) {
       subV.sortList.forEach((ss, k, data) => {
        if (k === data.length - 1) {
         typeIndex.push(data.length) // 把每一个类型下面数据长度存起来
         a += data.length // 把所有类型下面的数据长度相加
         if (i === typeData.length - 1) {
          nameIndex.push(a) // 类型循环完成后把数据长度存起来
         }
        }
        getDate.push({
         id: v.id,
         region: v.region,
         type: subV.sortName,
         name: ss.name
        })
       })
      }
     })
    }
   })

   console.log(nameIndex)
   // [0, 5, 4]
   // 看一下打印出来的规律,除去第一项,5是第一次需要合并的行
   // 第二次合并又是从第五行开始合并4行

   console.log(typeIndex)
   // [0, 2, 3, 2, 2]
   // 类型的数据存储规律也是一样,第一次合并2行
   // 第二次从2行开始,合并3行,以此类推

   // 根据这个规则,只需要给数据加上两个额外的属性控制是否合并就OK
   let k = 0
   let t = 0
   nameIndex.forEach((v, i, nameArr) => {
    if (nameArr[i + 1]) {
     getDate[k].nameIndex = nameArr[i + 1]
     k += nameArr[i + 1]
    }
   })

   typeIndex.forEach((v, i, typeArr) => {
    if (typeArr[i + 1]) {
     getDate[t].typeIndex = typeArr[i + 1]
     t += typeArr[i + 1]
    }
   })
   this.tableData6 = getDate
   console.log(getDate)
   // 0: {id: 1, name: "器械1", nameIndex: 5, region: "中国", type: "器械", typeIndex: 2},
   // 1: {id: 1, name: "器械2", region: "中国", type: "器械"}
   // ....
   // 5: {id: 2, name: "器械1", nameIndex: 4, region: "美国", type: "器械", typeIndex: 2}
  },

  // 表格合并方法
  arraySpanMethod ({ row, column, rowIndex, columnIndex }) {
   if (columnIndex === 0 || columnIndex === 1) {
    if (row.nameIndex) { // 如果有值,说明需要合并
     return [row.nameIndex, 1]
    } else return [0, 0]
   }
   if (columnIndex === 2) {
    if (row.typeIndex) {
     return [row.typeIndex, 1]
    } else return [0, 0]
   }
  },

再说一下另一种场景,用的另一种方法实现,原理都是大同小异

详解关于表格合并span-method方法的补充(表格数据由后台动态返回)

假设后台返回的数据是这样的:

详解关于表格合并span-method方法的补充(表格数据由后台动态返回)

在这种情况下,一般我们会选择对行进行合并,因为这时候表格的列是知道的,只要把需要合并的列提取出来,合并行就OK,下面看代码

<el-table
  :data="tableData6"
  :span-method="arraySpanMethod"
  border
  style="width: 100%">
  <el-table-column
   prop="id"
   label="ID"
   width="180">
  </el-table-column>
  <el-table-column
   prop="region"
   label="深圳">
  </el-table-column>
  <el-table-column
   prop="type"
   label="类型">
  </el-table-column>
  <el-table-column
   prop="company"
   label="企业名称">
  </el-table-column>
 </el-table>

js代码,首先需要处理一下后台数据

详解关于表格合并span-method方法的补充(表格数据由后台动态返回)

getIndex () {
   let arr = []
   let s = 0
   let table = this.tableData6
   let getTable = []
   table.forEach((item, i, data) => {
    if (arr.length) {
     s = arr[arr.length - 1].row + data[i - 1].company.length
    }
    arr.push({
     row: s,
     index: item.company.length
    })
    if (item.company && item.company.length) {
     item.company.forEach(subItem => {
      getTable.push({
       id: item.id,
       region: item.region,
       type: item.type,
       company: subItem.name
      })
     })
    }
   })
   this.arr = arr
   this.tableData6 = getTable
  },

数据处理之后就进行表格合并

// 合并表格方法
  arraySpanMethod ({ row, column, rowIndex, columnIndex }) {
   if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2) {
    let obj = [0, 0]
    this.arr.some(v => {
     if (rowIndex === v.row) {
      obj = [v.index, 1]
     }
    })

    return obj
   }
  }

PS: 在这里说一下楼主遇到的一个坑,其实也是因为对函数的return不熟悉造成的,一开始我是这样写的,

详解关于表格合并span-method方法的补充(表格数据由后台动态返回)

结果页面一直不对,debugger了一下,发现函数中根本没接收到return回去的数据,这是因为我return之后又写了代码,函数真正结束时没有返回值.所以在函数中,return之后就不要在写执行代码了.

详解关于表格合并span-method方法的补充(表格数据由后台动态返回)

详解关于表格合并span-method方法的补充(表格数据由后台动态返回)

正确的写法后debugger就能接收到正确的返回值了

详解关于表格合并span-method方法的补充(表格数据由后台动态返回)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery中常用的SET和GET
Jan 13 Javascript
js获取图片长和宽度的代码
Nov 24 Javascript
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
Dec 09 Javascript
javascript数组排序汇总
Jul 07 Javascript
AngularJS入门教程之AngularJS 模板
Aug 18 Javascript
EsLint入门学习教程
Feb 17 Javascript
Angular2实现组件交互的方法分析
Dec 19 Javascript
Vue.directive()的用法和实例详解
Mar 04 Javascript
实例讲解vue源码架构
Jan 24 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
Apr 17 Javascript
React学习之JSX与react事件实例分析
Jan 06 Javascript
浅谈React Native 传参的几种方式(小结)
May 21 #Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
May 21 #Javascript
JS判断数组里是否有重复元素的方法小结
May 21 #Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
May 21 #Javascript
vue路由守卫+登录态管理实例分析
May 21 #Javascript
vue实现跨域的方法分析
May 21 #Javascript
vue动态绑定class的几种常用方式小结
May 21 #Javascript
You might like
php安全配置 如何配置使其更安全
2011/12/16 PHP
PHP获取文件后缀名的三个函数
2012/10/15 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
Python collections模块实例讲解
2014/04/07 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
彻底理解Python中的yield关键字
2019/04/01 Python
python3中property使用方法详解
2019/04/23 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
四个太阳教学反思
2014/02/01 职场文书
人力资源部门的主要职能
2014/02/22 职场文书
关于读书的演讲稿
2014/05/07 职场文书
建筑施工安全责任书
2014/07/24 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
地道战观后感300字
2015/06/04 职场文书
呐喊读书笔记
2015/06/30 职场文书
董事长致辞
2015/07/29 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
yolov5返回坐标的方法实例
2022/03/17 Python