vue复杂表格单元格合并根据数据动态合并方式

 更新时间:2024年02月28日 10:20:51   作者:活泼可爱的小环环  
这篇文章主要介绍了vue复杂表格单元格合并根据数据动态合并方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

我们在开发中最常见的就是表格,而往往有一些复杂表格都不大好实现,对于合并单元格不是固定的,而是需要根据数据是否相同去动态设置合并的表格

本文把方法分享给大家,可以根据数据动态生成合并单元格,无论导出需求还是显示需求都不需要发愁了。

使用element的span-method方法实现合并

首先绘制表格,绑定合并方法:span-method=“objectSpanMethod4”

<!-- 列的合并 -->
    <el-table ref="tableDD4" id="tableDD4" :data="tableData4" :span-method="objectSpanMethod" max-height="600" border>
      <el-table-column label="一级表头" align="left">
        <el-table-column label="二级表头1" prop="firstCatalogue" align="left" width="300" />
        <el-table-column label="二级表头2" prop="secondCatalogue" align="left" />
        <el-table-column label="二级表头3" prop="insuranceName" align="left" width="140" />
        <el-table-column label="二级表头4" prop="isMatch" align="left" width="130" />
      </el-table-column>
    </el-table>

首先设置变量margeArray4,用来存储rowspan()方法计算出来的每一列单元格合并列数

rowspan()方法详细介绍

 index === 0,第一行,直接先给数组 push 进一个1,表示自己先占一行,position 是数组元素的位置 

(此时是从数组元素的第一个开始,所以position 为 0), position为 0 意思表示的就是数组的第一个元素

index 为 2 的时候,让第二行与第一行作比较: 

(1)如果第二行与第一行相等的话,spanArr[position] 就 +1,当有 n 行第一行相同,spanArr[position] 就为 n,表示向下合并 n 行; 

第二行自己就 spanArr.push(0),表示第二行“消失”,因为第一行和第二行合并了; 

(2)如果第二行与第一行不相等的话,那么 spanArr.push(1);就让第二行自己独占一行; 

更新position = index :把指针拿到 index 这行来,用来设置数组 spanArr[position] 的合并情况元素值,然后定义从此行开始向下合并几行

data() {
    return {
      //接收后端数据
      tableData1: [],
      //存储每一列合并行以及下标数据
      margeArray: [],
    }
},   
rowspan(tableData, spanArr, position, spanName) {
      tableData.forEach((item, index) => {
        if (index === 0) {
          spanArr.push(1);
          position = 0;
        } else {
          if (tableData[index][spanName] === tableData[index - 1][spanName]) {
            spanArr[position] += 1;
            spanArr.push(0);
          } else {
            spanArr.push(1);
            position = index;
          }
        }
      });
},

objectSpanMethod方法的实现:

// 表格合并行
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // 计算一共有几列数据
      let arraynum = Object.keys(this.tableData1[0]).length
      for (let i = 0; i < 2; i++) {
        if (columnIndex == i) {
          const _row = this.margeArray[i].Arr[rowIndex];
          const _col = _row > 0 ? 1 : 0;
          return {
            rowspan: _row,
            colspan: _col,
          };
        }
      }
},

axios请求数据之后,调用计算合并行,实现合并

//此处是我封装好的请求方法,你自己的实际情况修改即可
    this.$postRequest('/basicSystem/export/sheet1', { year: this.year }).then(({ data }) => {
        //判断请求状态为success/false,请求成功,处理数据,否则输出错误信息 
        if (data && data.type === 'success') {
          //接收后端返回的数据
          this.tableData1 = data.data
          //开始 调用方法计算需要合并的数据
          for (let i = 0; i < Object.keys(this.tableData1[0]).length; i++) {
            // 首先添加一个存放合并行数据的变量
            this.margeArray.push({ Arr: [], Position: 0, })
            // 得到下标对应的key值
            const element = Object.keys(this.tableData1[0])[i];
            // 调用合并,
            this.rowspan(this.tableData1, this.margeArray[i].Arr, this.margeArray[i].Position, element);
          }
        } else {
          this.$message.error(data.message)
        }
      }).catch(error => {
        this.$message.error(error)
      })

最后说一个很重要的点

注意:

此处因为是动态根据后端反的数据的key值去计算对应列的合并情况

所以必须!必须!必须!要保证后端返回的数据里key值顺序,要和前端table的展示顺序一直,否则合并会出错。

举例

前端页面table展示顺序:firstCatalogue为第一个,secondCatalogue为第二个以此类推

同样后端返回json数据中key顺序:firstCatalogue为第一个,secondCatalogue为第二个以此类

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • vue如何监听对象或者数组某个属性的变化详解

    vue如何监听对象或者数组某个属性的变化详解

    这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通过监听器函数接收新旧值,实现属性间的数据联动,需要的朋友可以参考下
    2024-12-12
  • Vue createRenderer 自定义渲染器从入门到实战

    Vue createRenderer 自定义渲染器从入门到实战

    本文主要介绍了Vue createRenderer 自定义渲染器从入门到实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • vue Router常用属性详解

    vue Router常用属性详解

    这篇文章主要介绍了vueRouter常用属性,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 深入理解Vue 单向数据流的原理

    深入理解Vue 单向数据流的原理

    这篇文章主要介绍了深入理解Vue 单向数据流的原理,详细的介绍了Vue 单向数据流的原理和使用,具有一定的参考价值,有兴趣的可以了解一下
    2017-11-11
  • vue3中各种类型文件进行预览功能实例

    vue3中各种类型文件进行预览功能实例

    在vue移动端项目中经常遇到这样的需求,对一些上传的附件可以点击之后在线预览,所以下面这篇文章主要给大家介绍了关于vue3中各种类型文件进行预览功能的相关资料,需要的朋友可以参考下
    2021-09-09
  • vue3中如何使用vue-types

    vue3中如何使用vue-types

    vue-types 在 Vue 3 中的使用主要适用于希望进行更细致的 prop 验证的场景,尤其是在 JavaScript 项目中,这篇文章给大家介绍vue3中如何使用vue-types,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • 深入理解 Vue 3 的 watch及用法示例小结

    深入理解 Vue 3 的 watch及用法示例小结

    watch是Vue3中处理响应式数据变化逻辑的基石,这篇文章将带你深入理解Vue3中的watch,涵盖基础用法、高级配置以及与watchEffect的对比,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • Vue3中响应式解构props的使用

    Vue3中响应式解构props的使用

    本文主要介绍了Vue3中响应式解构props的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • Vue3的动态组件使用场景与示例

    Vue3的动态组件使用场景与示例

    在 Vue 中,组件是构建用户界面的基础,而动态组件的引入,更是让开发者能够在应用中实现灵活、可重用的视图逻辑,本文将探讨 Vue 3 中的动态组件,分享其使用场景,并通过示例代码来说明其操作方法,需要的朋友可以参考下
    2025-01-01
  • uniapp实现APP、小程序与webview页面间通讯的实现步骤

    uniapp实现APP、小程序与webview页面间通讯的实现步骤

    这篇文章主要介绍了uniapp实现APP、小程序与webview页面间通讯的实现步骤,在Uniapp开发的APP或小程序页面中嵌入一个H5网页,并实现H5页面与APP之间的数据传递,需要的朋友可以参考下
    2025-01-01

最新评论