vue + el-table 动态合并单元格(多条件叠加)

  • 需求说明:

    1. 合并相同项单元格
    2. 部分单元格合并需要额外叠加条件
    3. 可动态增减
  • 实现思路
    通过倒序遍历数组,符合条件时使用combineProp进行累加,并设置当前单元格属性rowspan和colspan为0,直到不符合条件后对当前项rowspan进行赋值

  • 实现效果:


    ........
data:{
  return() {
      dataList: []
  }
},
methods: {
        mergeData( list ) {
            // mergeTarge - 合并项依据
            // combineProp - 根据mergeTarge 进行合并的单元格属性
            let config = {
                mergeTarget: 'id', // 通用依据
                combineProp: [
                    'id',
                    'name',
                    {
                        mergeTarget: 'name',
                        combineProp: ['amount1','amount2']
                    },
                    'amount3'
                ]
            } 
            return this.filterData( config, [].concat(list) )
        },
        filterData( config, dataList, targetProp ) {
            const { mergeTarget, combineProp } = config
            // 叠加的合并条件
            combineProp.forEach((column, index) => {
                // 记录合并项
                let combineCount = 1
                if( this.isObject( column ) ) {
                    return this.filterData.call(this, column, dataList, mergeTarget)
                }
                // 使用倒序遍历
                for(let i = dataList.length -1; i >= 0 ; i--) {
                    let curr = dataList[i],
                        prev = dataList[i-1]
                    
                    if(this.isEmpty(prev)) {
                        // 已经循环完毕
                        curr[`${column}-span`] = {
                            rowspan: combineCount,
                            colspan: combineCount >= 1 ? 1 : 0
                        }
                        break;
                    }

                    if( ( prev[targetProp] === curr[targetProp] &&
                            prev[mergeTarget] === curr[mergeTarget] ) &&
                            prev[`${column}`] === curr[`${column}`] 
                        ) { 

                        ++combineCount;
                        curr[`${column}-span`] = {
                            rowspan: 0,
                            colspan: 0
                        } 

                    } else {
                        curr[`${column}-span`] = {
                            rowspan: combineCount,
                            colspan: combineCount >= 1 ? 1 : 0
                        } 
                        prev[`${column}-span`] = {
                            rowspan: 1,
                            colspan: 1,
                        }
                        // 前后项不相符时,对combinecount进行重置
                        combineCount = 1
                    }  
                }
            })
            return dataList
        },
    }
  .......
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容