vxe-table表格合并行和虚拟滚动冲突

项目一直用的vxe-table 2.0版本,支持表格的虚拟滚动,最近要做表格合并行功能,虚拟滚动便失效了,强行虚拟滚动,合并行会有错行现象。
vxe-table2.0给出的解释是:合并行不能和虚拟滚动一起使用。

目前找到两种解决方式:

1.升级表格到3.0版本

vxe-table3.0支持合并行虚拟滚动,但是它支持的是临时合并状态的表格,我们用的一般都是span-methods自定义合并函数。
比如,这种写法是一行一行比较,遇到adjustDicName和commonId相同的就把'index', 'adjustDicName', 'wantNum', 'totalPlanNum', 'zbPrice', 'forwardNum', 'prevForwardMoney', 'unscheduledNum',这些字段都合并了。

但这种在vxe-table3.0也是不支持虚拟滚动的。

  // 合并规则
        rowspanMethod({
            row,
            _rowIndex,
            column,
            visibleData
        }) {
            let fields = ['index', 'adjustDicName', 'wantNum', 'totalPlanNum', 'zbPrice', 'forwardNum', 'prevForwardMoney', 'unscheduledNum']
            let cellValue = row[column.property]
            let xtmcCell = row['adjustDicName']
            let xtmcCell2 = row['commonId']
            if (fields.includes(column.property)) {
                let prevRow = visibleData[_rowIndex - 1]
                let nextRow = visibleData[_rowIndex + 1]
                if (prevRow && prevRow[column.property] == cellValue && prevRow['adjustDicName'] == xtmcCell && prevRow['commonId'] == xtmcCell2) {
                    return {
                        rowspan: 0,
                        colspan: 0
                    }
                } else {
                    let countRowspan = 1
                    while (nextRow && nextRow[column.property] == cellValue && nextRow['adjustDicName'] == xtmcCell && nextRow['commonId'] == xtmcCell2) {
                        nextRow = visibleData[++countRowspan + _rowIndex]
                    }
                    if (countRowspan > 1) {
                        return {
                            rowspan: countRowspan,
                            colspan: 1
                        }
                    }
                }
            }
        },

看官网例子vxe-table v3
可以通过 merge-cells 做临时合并,我们只要把表格的需要合并状态全部计算提取出来,便可以实现合并行的虚拟滚动。

怎么提取呢?
把需要合并的第一行给你一个标志,比如 以下三行合并num:3,  以下一行合并num:1, 剩下的为num:0

处理数据:

  handleListRowSpan() {
            let prevItem
            this.tableData.forEach(item => {
                item.num = 0
                if (prevItem && prevItem.adjustDicName == item.adjustDicName && prevItem.commonId == item.commonId) {
                    prevItem.num++
                } else {
                    item.num = 1 // 初始化合并行数
                    prevItem = item
                }
                
            })
          console.log('this.tableData',this.tableData)
          let arr=[]
          this.tableData.forEach((ele,index)=>{
                 if(ele.num>1){
                    arr.push({row:index,col:0,rowspan:ele.num,colspan:1})
                    arr.push({row:index,col:1,rowspan:ele.num,colspan:1})
                    arr.push({row:index,col:2,rowspan:ele.num,colspan:1})
                    arr.push({row:index,col:3,rowspan:ele.num,colspan:1})
                    arr.push({row:index,col:4,rowspan:ele.num,colspan:1})
                    arr.push({row:index,col:5,rowspan:ele.num,colspan:1})
                    arr.push({row:index,col:6,rowspan:ele.num,colspan:1})
                    arr.push({row:index,col:7,rowspan:ele.num,colspan:1})
                }
          })
        console.log('this.mergeCells,',arr)
        this.mergeCells=arr
        },

第一个循环是把处理成带num:合并行数 或者 num:0 标识的数据
第二个循环是把数据处理成mergeCells需要的数据格式,row:第几行,col:第几列,rowSpan:合并几行,colSpan:合并几列。

灵感来源于这个博友的文章:element-ui表格,el-table多级合并行_element puls 中的tabel表格实现多层级合并-CSDN博客

2.使用el-table-virtual-scroll表格

官网api:el-table-virtual-scroll


这个表格也是支持虚拟滚动和合并行一起使用的。具体可以自己看官网,但是他的表格功能没有vxe-table丰富,如果使用,之前的逻辑的逻辑要改的太多,便没有采用。

总结:

方法一:升级表格,

        对当前需要虚拟加载的合并行表格页面修改的代码不多,但是升级表格会有系统有不可预知的影响,比如一些废弃的api需要更换,我们之前用的vxe-table-plugin-virtual-tree需要依赖于vxe-table2.0,升级后组件虚拟滚动功能会失效(如何解决下一篇写)等等。在项目前期使用较好。
        还有一个限制,合并行如果是十几个或者几十个一合并,这种方法还可以,但是几百个,几千个一合并,组件默认一次至少加载一个合并行的数据,还是会卡.

 
方法二:换表格,

在项目后期使用较好,对系统其他模块没有影响,但是很多功能没有vxe-table齐全。

<think>好的,我现在需要解决用户在vxe-table使用span-method合并后出现的滚动错位问题。用户提到已经尝试合并单元格,但下拉后出现错位,并指出可能缺少scroll-y配置。我需要先理解vxe-table中span-method虚拟滚动的关系。 首先,span-method用于合并单元格,而虚拟滚动(virtual scroll)是为了优化性能,只渲染可见区域的内容。这两者可能存在冲突,因为虚拟滚动动态计算元素位置,而合并单元格可能改变高或列宽,导致计算错误。 用户提供的引用中提到需要设置scroll-y="{enabled: false}",这说明关闭虚拟滚动可能解决问题。但用户可能希望同时使用合并单元格虚拟滚动,所以需要验证是否有其他解决方案,或者是否有配置遗漏。 查阅vxe-table的文档,发现虚拟滚动合并确实有兼容性问题。因为虚拟滚动依赖固定的高,合并后可能导致高变化,而虚拟滚动无法动态调整,从而引发错位。官方建议在这种情况下禁用虚拟滚动,或者采用其他方式处理合并。 可能的解决方案包括: 1. 禁用虚拟滚动,直接设置scroll-y.enabled为false,但可能影响性能。 2. 调整span-method的实现,确保合并后的不会影响虚拟滚动的计算,但可能较为复杂。 3. 使用其他方式实现类似效果,比如分组,但功能可能不同。 根据用户反馈文档,最直接的解决方法是关闭虚拟滚动。因此,建议用户修改配置,添加scroll-y="{enabled: false}",并测试是否解决问题。如果必须使用虚拟滚动,可能需要等待官方更新或寻找其他变通方法。</think>关于vxe-table合并单元格与虚拟滚动冲突的解决方案如下: ### 问题分析 当使用$span-method$合并时,虚拟滚动(virtual scroll)会因动态渲染机制导致高计算错误,从而出现滚动条错位现象。这是由于: 1. 虚拟滚动默认根据固定高预计算滚动位置[^1] 2. 合并单元格会改变实际渲染数 3. 动态渲染区域与实际DOM结构存在差异 ### 解决方案 #### 方法一:禁用虚拟滚动(推荐) 在表格配置中添加: ```javascript <vxe-table :span-method="rowspanMethod" :scroll-y="{enabled: false}" > ``` 这会关闭纵向虚拟滚动功能,确保合并后的DOM结构完整渲染 #### 方法二:动态计算高(高级) 通过自定义渲染逻辑实现: ```javascript { scrollY: { gt: 20, // 当数据量超过20时启用 mode: 'wheel', oSize: 45 // 根据合并后的实际高调整该值 } } ``` 需配合$row-span$属性动态计算合并后的高 ### 验证步骤 1. 检查合并逻辑是否返回正确的`{ rowspan: N, colspan: 1 }` 2. 确保表格父容器有固定高度 3. 在$updated$生命周期中调用`refreshScroll()`方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值