Vue+Element-UI中el-table动态合并单元格:span-method方法代码详解

 更新时间:2023年09月26日 15:42:21   作者:temperate__  
el-table是element-ui提供的表格组件,可以用于展示和操作数据,这篇文章主要给大家介绍了关于Vue+Element-UI中el-table动态合并单元格:span-method方法的相关资料,需要的朋友可以参考下

合并单元格

记录一下工作时遇到的 el-table 合并单元格的需求,超详细😊

el-table官方提供了合并单元格的方法与返回格式 如下:

根据叙述有了如下思路:

因为后端返回的数据非统一, 可能不是按照类别排好的😨, 所以官网的例子满足不了所有的需求所以我们通过遍历table的数据比较前后两个元素是否相等, 来构造一个spanArr用来存放rowspan, 最后通过rowspan的值来判断colspan的值😊.

案例如下, 这是我需要处理的一个表格:

需要根据数据动态的合并

对应的配置数组为

处理数据

因为获取的数据的非统一性, 我们首先要将数据根据我们想要合并的字段进行排序分组, 这里我实现了一个简单的方法来处理数据:

// data 为 表格数据 , params 为需要合并的字段
groupBy (data, params) {
    const groups = {};
    data.forEach(v => {
    	// 获取data中的传入的params属性对应的属性值
        const group = JSON.stringify(v[params]);
        // 把group作为groups的key,初始化value,循环时找到相同的v[params]时不变
        groups[group] = groups[group] || [];
        // 将对应找到的值作为value放入数组中
        groups[group].push(v);
    })
    // 返回处理好的二维数组
    return Object.values(groups);
},

此时打印一下我们的数据 console.log(this.groupBy(this.tableListData.items, 'FirstIndex'))

如图, 我们已经将数据分好组并合并在一个数组中啦, FirstIndex 相同的在一个数组

构造控制合并的数组spanArr

这里实现了一个方法, 用来构造一个 spanArr 数组赋予 rowspan ,即控制行合并

  • 接收重构数组 let arr = []
  • 设置索引 let pos = 0
  • 控制合并的数组 this.spanArr = []

先将groupby()处理好的数据再次用arr进行处理:连接所有数组成员为一个新数组 this.groupBy(this.tableListData.items, 'FirstIndex').map(v => (arr = arr.concat(v)))

现在处理好了数据,需要赋予原数据了:this.tableListData.items = arr

但是因为我是写在 getSpanArr(data, params) 方法中的,已经通过形参data将 this.tableListData.items传入了这里,如果想方便封装调用的话,不用每次使用都需要再次写入 this.tableListData.items = arr于是想到一个办法,js数组的shift()和push()是直接修改数组所占内存的方法。

所以有:

arr.map(res => {
    // 每次遍历都删除data && this.tableListData.items的第一个元素
    data.shift()
    // 每次遍历都将arr数组元素对应push进 data && this.tableListData.items
    data.push(res)
})

还需要定义一个 redata 存放arr要合并字段的valueconst redata = arr.map(v => v[params])

reduce处理spanArr数组 ⭐⭐

使用 reduce 方法比较redata前后两个元素是否相等,相等的话spanArr中对应索引的元素的值+1,并且在其后增加一个0占位(防止合并过后表格数据错位),否则的话增加一个1占位,并记录当前索引,往复循环,构造一个给 rowspan 取值判断合并的数组:

  const redata = arr.map(v => v[params])
  redata.reduce((old, cur, i) => {
    // old 上一个元素  cur 当前元素  i 索引
    if (i === 0) {
      // 第一次判断先增加一个 1 占位 ,索引为0 
      this.spanArr.push(1)
      pos = 0
    } else {
      if (cur === old) {
        this.spanArr[pos] += 1
        this.spanArr.push(0)
      } else {
        this.spanArr.push(1)
        pos = i
      }
    }
    return cur
  }, {})

看一下现在的数据 spanArr , 这里传的参数为 SecondIndex , 即表格的第二列

数组中大于0的数字就是我们数据中要合并的这组数据的数量, 同时也是这组数据需要合并的列数,而0就是代表这列不合并, 依次遍历,实现合并所选字段这一列的最终目的

如图理解:

返回最终结果

最后一步啦😊根据官方给的方法把我们处理好的spanArr传给rowspan即可

spanMethod({ row, column, rowIndex, columnIndex }) {
  // 第一列
  if (columnIndex === 0) {
    const _row = this.spanArr[rowIndex];
    const _col = _row > 0 ? 1 : 0;
    return {
      rowspan: _row,
      colspan: _col
    }
  }
}

效果如图!

完整代码

就很nice, !!最后把完整代码贴上:

// ......
    mounted() {
      this.getSpanArr(this.tableListData.items, 'FirstIndex');
    },
    methods: {
      groupBy (data, params) {
        const groups = {}
        data.forEach(v => {
          const group = JSON.stringify(v[params])
          groups[group] = groups[group] || []
          groups[group].push(v)
        })
        return Object.values(groups)
      },
      getSpanArr (data, params) {
        let arr = []
        let pos = 0
        this.spanArr = []
        this.groupBy(data, params).map(v => (arr = arr.concat(v)))
        arr.map(res => {
          data.shift()
          data.push(res)
        })
        const redata = arr.map(v => v[params])
        redata.reduce((old, cur, i) => {
          if (i === 0) {
            this.spanArr.push(1)
            pos = 0
          } else {
            if (cur === old) {
              this.spanArr[pos] += 1
              this.spanArr.push(0)
            } else {
              this.spanArr.push(1)
              pos = i
            }
          }
          return cur
        }, {})
      },
      spanMethod({ row, column, rowIndex, columnIndex }) {
        if (columnIndex === 0) {
          const _row = this.spanArr[rowIndex];
          const _col = _row > 0 ? 1 : 0;
          return {
            rowspan: _row,
            colspan: _col
          }
        }
      }
    }

完美! 撒花!!!🎉🎉🎉

总结

到此这篇关于Vue+Element-UI中el-table动态合并单元格:span-method方法的文章就介绍到这了,更多相关el-table动态合并单元格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue使用Highcharts实现3D饼图

    vue使用Highcharts实现3D饼图

    这篇文章主要为大家详细介绍了vue使用Highcharts实现3D饼图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • vue 之 css module的使用方法

    vue 之 css module的使用方法

    这篇文章主要介绍了vue 之 css module的使用方法,css module目的为所有类名重新生成类名,有效避开了css权重和类名重复的问题,非常具有实用价值,需要的朋友可以参考下
    2018-12-12
  • 全新打包工具parcel零配置vue开发脚手架

    全新打包工具parcel零配置vue开发脚手架

    parcel-vue 一个基于Parcel打包工具的 VueJS急速开发脚手架解决方案,强烈建议使用node8.0以上。下面通过本文给大家介绍全新打包工具parcel零配置vue开发脚手架的相关知识,感兴趣的朋友一起看看吧
    2018-01-01
  • vue parseHTML函数解析器遇到结束标签

    vue parseHTML函数解析器遇到结束标签

    这篇文章主要介绍了vue parseHTML函数源码解析之析器遇到结束标签的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Vue中transition标签的基本使用教程

    Vue中transition标签的基本使用教程

    Vue提供了transition的封装组件,可以给任何元素和组件添加进入/离开过渡,下面这篇文章主要给大家介绍了关于Vue中transition标签基本使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • vue实现搜索并高亮文字的两种方式总结

    vue实现搜索并高亮文字的两种方式总结

    在做文字处理的项目时经常会遇到搜索文字并高亮的需求,常见的实现方式有插入标签和贴标签两种,这两种方式适用于不同的场景,各有优劣,下面我们就来看看他们的具体实现吧
    2023-11-11
  • Vue传参一箩筐(页面、组件)

    Vue传参一箩筐(页面、组件)

    这篇文章主要介绍了Vue传参一箩筐(页面、组件),Vue页面、组件之间传参方式繁多,此处罗列出常用的几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • 浅谈vue项目打包优化策略

    浅谈vue项目打包优化策略

    这篇文章主要介绍了浅谈vue项目打包优化策略,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 使用axios请求时,发送formData请求的示例

    使用axios请求时,发送formData请求的示例

    今天小编就为大家分享一篇使用axios请求时,发送formData请求的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • vue 鼠标移入移出(hover)切换显示图片问题

    vue 鼠标移入移出(hover)切换显示图片问题

    这篇文章主要介绍了vue 鼠标移入移出(hover)切换显示图片问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10

最新评论