动态合并行和列(element-ui)

简介: 动态合并行和列(element-ui)

动态合并行和列

根据key值是否相同来合并 列或行。

效果图:
image.png

核心思想是构造存放rowspan,colspan 对应关系的数组。

element-ui 提供span-method 的方法。 具体查看文档。

<el-table :data="listData" border :span-method="arraySpanMethod">
 // 构造  this.rowspanMapArr  如下图所示
 // 构造  this.colspanMapArr  如下图所示

 arraySpanMethod({
   
    row, column, rowIndex, columnIndex }) {
   
   
        return {
   
   
          rowspan: this.rowspanMapArr[columnIndex][rowIndex],
          colspan: this.colspanMapArr[rowIndex][columnIndex],
        };
    },

image.png

对应的key 数组。

   const keyMap = [
          'key1',
          'key2',
          'key3',
          'key4',
      ]

// arraySpanMethod 里面用了下标,所以不在keyMap 除去不合并的 key

  const norMergeKeyArr = [
      'key4',
  ]
  data(){
   
   
     return {
   
   
        listData: [
               {
   
   
                  key1:'上下行合并',
                  key2:'1111'
                  key3:''
               },
                 {
   
   
                  key1:'上下行合并',
                  key2:'1111'
                  key3:''
               },
                 {
   
   
                  key1:'左右列合并', 
                  key2: null
                  key3: null
               },
        ]
     } 
  },
  created(){
   
   
      console.log('listData.length-->', this.listData.length)
      keyMap.forEach((keyName, innerIndex) => {
   
   
         this.rowspanMapArr.push(this.rowspan( [], 0, keyName) ) 
      })
      console.log('rowspanMapArr---> ',this.rowspanMapArr)
      this.genrateColspanArr();
  },
  methods: {
   
   
    rowspan(spanArr, position, spanName) {
   
   
      this.listData.forEach((item, index) => {
   
   
          if( norMergeKeyArr.includes(spanName)){
   
   
               spanArr.push(1);
          }else{
   
   
              if (index === 0) {
   
   
                spanArr.push(1);
                position = 0;
                } else {
   
   
                    if (
                        this.listData[index][spanName] ===
                        this.listData[index - 1][spanName]
                    ) {
   
   
                        spanArr[position] += 1;
                        spanArr.push(0);
                    } else {
   
   
                        spanArr.push(1);
                        position = index;
                    }
                }
          }
      });
      return spanArr
    },
    genrateColspanArr() {
   
   
      this.listData.forEach((item, outIndex) => {
   
   
          let curPos ;
          let colMapArr = []
          keyMap.forEach((keyName, innerIndex) => {
   
   
             if ( innerIndex === 0 && item[keyName] ) {
   
   
                        colMapArr.push(1);
                        curPos = 0;
                    } else {
   
   
                    //。左右列合并 通过判断 key 是否为 null 之类的,具体情况具体分析。
                    // 最好用lodash 之类工具判断  
                        if ( !item[keyName] && item[keyName] != 0 ) {
   
   
                            colMapArr[curPos] += 1;
                            colMapArr.push(0);
                        } else {
   
   
                            curPos = innerIndex
                            colMapArr.push(1);
                        }
                }
         })
         this.colspanMapArr.push(colMapArr)
      });
      console.log('colspanMapArr--',this.colspanMapArr)
    },
    arraySpanMethod({
   
    row, column, rowIndex, columnIndex }) {
   
   
        return {
   
   
          rowspan: this.rowspanMapArr[columnIndex][rowIndex],
          colspan: this.colspanMapArr[rowIndex][columnIndex],
        };
    },
  },

总结:

这里分rowspan 和 colsan 情况。

  1. 根据数据源的同个key 的value值是否一致,来判断是否上下行合并。 计算出各个rowspan的值。
  2. 根据单条数据源内的key对应的value值,要保证一定的顺序。也就是说,下一个key的value值为null,上一个key的value值不为null 而合并,计算出各个 colspan 值。
相关文章
|
SQL 前端开发 搜索推荐
【Element-UI】实现动态树、数据表格及分页效果
在现代软件开发中,动态树、数据表格以及分页效果成为了许多应用的核心需求。随着业务规模和复杂性的增加,我们往往需要展示大量的层级结构数据,并且实现交互性强且高效的操作。 动态树提供了一种组织结构清晰、可伸缩的展示方式,使用户可以方便地查看和操作树节点。数据表格则是以表格形式呈现数据,在其中用户可以进行排序、筛选、编辑等操作。 而分页效果则能够将大量数据分割成易于管理和浏览的一页或一页的内容。这三种功能的结合,不仅使得我们能够更好地处理庞大的数据集合,同时也使得用户能够快速定位所需信息。 本文将介绍如何使用现代前端技术实现动态树、数据表格及分页
|
JavaScript
element-UI el-table动态显示隐藏列造成固定一侧的列(fixed=“left/right“)错误显示
问题原因:多个tabs共用一个实体,动态显示隐藏列 出现了固定在右侧的列(fixed="right")错位 【解决方案】 表格的重新布局,只要table数据发生变化的时候就重新渲染表格 ```js this.$nextTick(() => { this.$refs.formname.doLayout() }) ``` 参考element官方文档 ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-e40
242 0
element-UI el-table动态显示隐藏列造成固定一侧的列(fixed=“left/right“)错误显示
|
前端开发 JavaScript API
在 Vue3 + Element Plus 中生成动态表格,动态修改表格,多级表头,合并单元格
在 Vue 中,表格组件是使用频率及复杂度排名第一的组件,前端经常需要根据后台返回的数据动态渲染表格,比如动态表格如何生成,因为表格的列并不是固定的,在未知表格具体有哪些列的场景下,前端如何动态渲染表格数据。又或者需要把表格单元格进行合并处理,比如第一列是日期,需要把相同的日期进行合并,这样表格看起来会更加清晰。 本文手把手教你如何在 Vue3 + Element Plus 中创建表格、生成动态表格、创建动态多级表头、表格行合并、列合并等问题。如果你正在搭建后台管理工具,又不想处理前端问题,推荐使用卡拉云 ,卡拉云是新一代低代码开发工具,可一键接入常见数据库及 API ,无需懂前端,仅需拖拽即
3080 0
|
6月前
Element多级表格合并处理
Element多级表格合并处理
29 0
|
6月前
|
前端开发 小程序
使用element UI-table表格列宽自适应 【已解决】
使用element UI-table表格列宽自适应 【已解决】
368 0
Element-ui 表格 (Table) 组件中动态合并单元格
Element-ui 表格 (Table) 组件中动态合并单元格
916 0
Element-ui 表格 (Table) 组件中动态合并单元格
|
JavaScript
VUE element-ui之table表格勾选复选框动态合计某列的值
VUE element-ui之table表格勾选复选框动态合计某列的值
590 0
VUE element-ui之table表格勾选复选框动态合计某列的值
element-ui可编辑行增加行或删除行
element-ui可编辑行增加行或删除行