Element-UI动态表格合并导致触发Vue视图更新,从而无限循环问题

1.前言

	在做一个项目的时候,遇到一个需求,需要根据后台返回的数据,动态的进行表格合并,比如下面这种。

Elememt 官网示例
这个Element官网示例是每两列合并一行,或者没两行合并一列的规则。(当然会有一些限制条件),但是我们实际项目开发中,肯定不可能写死,而是需要根据数据进行动态的渲染,于是乎就遇到这么一个问题。

2.问题

第0列是表头标志列,这列的数据会有重复项,比如,第0列为ID,然后返回的数据中ID的数据为[1,2,2,3,4,5,5,5,6],那么2这个ID就需要合并,占得单元格就应该是2行1列,因为对应的有两条记录,5这个ID也需要合并,占3行一列,因为对应了三条记录。然后设计代码实现的时候,Vue报了无限循环的错误

3.解决代码

methods:{
	objectSpanMethod({ row, column, rowIndex, columnIndex }){
          if (columnIndex === 0)
          {
            if (index>this.res.length-1)
            {
              index = 0;
              currentBeginRowIndex = -1;
            }
              if(rowIndex > currentBeginRowIndex)
              {
                let sameLength = this.res[index].record_list.length;
                index++;
                currentBeginRowIndex = currentBeginRowIndex + sameLength;
                return {
                  rowspan: sameLength,
                  colspan: 1
                };
              }
              else
              {
                return {
                  rowspan: 0,
                  colspan: 0
                }
              }
            }
    }
}

res为ID相同条数的记录数组,比如对于上述[1,2,2,3,4,5,5,5,6]来说,res = [1,2,1,1,3,1],也就是说这个res的长度就是有多少个不同的数据项,并且对应着每个不同的数据项的个数。
index就是res数组的下标。
currentBeginIndex就是当前数据项结尾,下一个数据开始渲染的标志位。
这里需要注意的是,一定要把index和currentBeginIndex定义为全局变量,不然就会报无限循环的错误。因为View数据更新会触发视图更新,视图更新又会调用绑定的Element-UI绑定的格式化方法,从而导致View数据更新,导致无限循环。放在data外面就可以避免这种问题。![在这里插入图片描述](https://img-blog.csdnimg.cn/20200930101009754.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5NjM2OQ==,size_16,color_FFFFFF,t_70#pic_center
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
当使用element UI渲染一个表格时,我们有时需要在数据发生变化的情况下重新渲染表格,可以通过调用element UI提供的API实现。 首先,在Vue组件中,需要在data对象中定义表格需要用到的属性,例如columns、data等。当需要重新渲染表格时,我们需要手动更新data中的数据。更新完成后,调用element UI提供的this.$nextTick()方法来保证数据已经更新完成,然后调用this.$refs.table.$forceUpdate()方法来强制更新表格视图。 以一个简单的示例来演示: <template> <el-table ref="table" :data="tableData" :columns="tableColumns"></el-table> <el-button @click="handleClick">重新渲染表格</el-button> </template> <script> export default { data() { return { tableColumns: [ { label: '姓名', prop: 'name' }, { label: '年龄', prop: 'age' } ], tableData: [ { name: '小明', age: 18 }, { name: '小红', age: 20 } ] } }, methods: { handleClick() { // 更新表格数据 this.tableData.push({ name: '小花', age: 22 }) // 强制更新表格视图 this.$nextTick(() => { this.$refs.table.$forceUpdate() }) } } } </script> 在这个示例中,点击按钮会触发handleClick方法,在该方法中向tableData数组中添加一个新的数据项,并且使用this.$nextTick()保证数据已经更新完成,然后使用this.$refs.table.$forceUpdate()强制更新表格视图,完成表格的重新渲染。 需要注意的是,$forceUpdate()方法并没有重新请求数据的过程,只是强制更新表格视图,如果需要重新请求数据进重新渲染表格,还需要在updateData()方法中加入请求数据的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值