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

这篇具有很好参考价值的文章主要介绍了Vue+Element-UI 中 el-table 动态合并单元格 :span-method 方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

合并单元格

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

el-table官方提供了合并单元格的方法与返回格式 如下:
:span-method,vue.js,前端,javascript,elementui
根据叙述有了如下思路:
因为后端返回的数据非统一, 可能不是按照类别排好的😨, 所以官网的例子满足不了所有的需求所以我们通过遍历table的数据比较前后两个元素是否相等, 来构造一个spanArr用来存放rowspan, 最后通过rowspan的值来判断colspan的值😊.

案例如下, 这是我需要处理的一个表格:
需要根据数据动态的合并
:span-method,vue.js,前端,javascript,elementui
对应的配置数组为
:span-method,vue.js,前端,javascript,elementui

处理数据

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

// 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'))
:span-method,vue.js,前端,javascript,elementui
如图, 我们已经将数据分好组并合并在一个数组中啦, 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要合并字段的value
const 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, 即表格的第二列
:span-method,vue.js,前端,javascript,elementui
数组中大于0的数字就是我们数据中要合并的这组数据的数量, 同时也是这组数据需要合并的列数,而0就是代表这列不合并, 依次遍历,实现合并所选字段这一列的最终目的 如图理解:
:span-method,vue.js,前端,javascript,elementui

返回最终结果

最后一步啦😊根据官方给的方法把我们处理好的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
    }
  }
}

效果如图!
:span-method,vue.js,前端,javascript,elementui

完整代码

就很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
          }
        }
      }
    }

完美! 撒花!!!🎉🎉🎉文章来源地址https://www.toymoban.com/news/detail-660324.html

到了这里,关于Vue+Element-UI 中 el-table 动态合并单元格 :span-method 方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Element-UI 解决el-table合并行+固定列鼠标浮动高亮问题

    今天在搬砖的时候发现了一个问题,当用el-table组件画表格,并且存在合并行时,鼠标浮动的高亮样式有些问题,如下图。 可以看到虽然已经合并成为了一行但是,高亮部分的显示样式仍然是分家状态。由于我画的表格需要有固定列,虽然百度了一些大神的方法,但是仍然没

    2024年02月11日
    浏览(41)
  • vue使用element-ui,el-table不显示

    例如:新增了一个表格,按官网代码贴过来的,结果一直不显示 代码如下一模一样,其他数据正常显示,就表格不显示 其实版本库不一致导致的,贼坑,又不提示 先卸载element-ui安装一个低版本的element-ui就可以解决``

    2024年02月11日
    浏览(47)
  • vue element-ui表格(el-table)数据导出execl文件

    功能实现:element UI 的el-table数据导出为execl文件 使用到插件:xlsx、file-saver exportExecl.js 代码如下: 页面代码如下:

    2024年02月14日
    浏览(42)
  • vue中element-ui表格组件el-table封装,在table表格中插入图片

            这次写的项目是写后台管理系统这部分,对于后台管理使用vue写,用组件的话,table组件用得次数比较多,可以封装一个table组件。         1.如封装的table组件:  :prop=\\\"item.prop\\\"  :label=\\\"item.label\\\"是必须要有的,其他的可以根据自己需要写 。 2.封装之后是就是使

    2024年02月15日
    浏览(40)
  • 解决vue-electron element-UI中el-table表格不显示

    问题:element-UI官网上el-table组件,引入自己项目的时候表格不显示。 解决方案: 修改.electron-vuewebpack.renderer.config.js 将 修改为 即可解决。

    2024年02月16日
    浏览(38)
  • vue中数据滚动显示 实现Element-UI中el-table内数据的懒加载

    工作中我们经常会用到element-ui组件库中的le-table组件来展示数据,但当table的数据源数量过大的时候统一展示可能会出现页面卡顿,且会影响用户体验,为此我们可以尝试对el-table中的数据做懒加载的效果展示: 1. 挂在阶段监听el-table的scroll滚动事件 2. 当table表格滚动条的位置

    2023年04月08日
    浏览(45)
  • Vue2.0+Element-ui(2.15.13)出现el-table不显示问题解决方案

    遇到的问题: Element-ui中的 el-table组件 无法正常显示; 1.安装的Vue是2.0版本; 2.安装的Element-ui是2.15.13版本 原因: 1.一个项目调用了element-ui和vant两个ui库,有冲突; 2.Element-ui是2.15.13版本依赖比较高;   解决方案: 1.npm uninstall element-ui;下载Element-ui 2.npm install element-ui@2.8.3

    2024年02月11日
    浏览(41)
  • Vue 中 Element UI 的 el-table 组件实现动态表头和内容

    在 Vue 中使用 Element UI 的 el-table 组件时,为了实现动态表头(包括第一层表头及其下的嵌套表头或子表头)。需要后端返回的数据结构能够体现表头层级关系以及对应的数据结构相匹配。这样的数据通常是一个嵌套数组,每个表头单元可能包含自身的列信息以及它的子表头和

    2024年01月20日
    浏览(44)
  • Vue+Element-UI 实现前端分页功能,利用el-table和el-pagination组件实现表格前端分页

    Vue+Element-UI 实现前端分页功能,利用el-table和el-pagination组件实现表格前端分页:         当table的数据量比较大的时候,一个屏幕展示不出全部的数据,这个时候就需要分页显示。而多数情况下都是做的后端分页,就是将分页参数和查询条件一并传到后端,后端将当前页要

    2024年01月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包