如何解决element Plus树形表格懒加载只执行一次

不知道大家有没有遇到过使用element的表格懒加载只会执行一次的情况,但是这样就会出现一种问题。当你加载完列表项的子数据之后,如果你对子数据有所修改但是你的懒加载是无法再次执行重新加载你修改之后的子数据,只有重新刷新也面,才能重新执行懒加载获得修改之后的子数据。那么这个问题该怎么解决呢?据我所知有两种方法,我个人更加推荐第二种方法。

这是基于elementPlus+vue3使用vue2和elment可能会有一点差别,但是大致应该是一样的改一下就好啦

方法一

下面是element中对table懒加载的使用

js 复制代码
<template>
  <div>
    <el-table :data="tableData" style="width: 100%" row-key="id" border lazy :load="load"
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
      <el-table-column prop="date" label="日期" width="180">
      </el-table-column>
      <el-table-column prop="name" label="姓名" width="180">
      </el-table-column>
      <el-table-column prop="address" label="地址">
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        tableData: [{
          id: 1,
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          id: 2,
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1517 弄'
        }, {
          id: 3,
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1519 弄',
          hasChildren: true
        }, {
          id: 4,
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1516 弄'
        }]
      }
    },
    methods: {
      load(tree, treeNode, resolve) {
        setTimeout(() => {
          resolve([
            {
              id: 31,
              date: '2016-05-01',
              name: '王小虎',
              address: '上海市普陀区金沙江路 1519 弄'
            }, {
              id: 32,
              date: '2016-05-01',
              name: '王小虎',
              address: '上海市普陀区金沙江路 1519 弄'
            }
          ])
        }, 1000)
      }
    },
  }
</script>

在代码中可以看见我们执行懒加载时调用的是load方法,这个方法有三个参数,但是这三个参数并不是我们传入的而是element作者对table进行封装时默认传入的。如果我们要想手动的调用load方法并重新进行懒加载获取新的数据那就必须要获得这三个参数。这里最简单的办法就是在每一次运行load时把load的三个参数存在一个对象里面,在后面如果需要调用laod方法就去对象中寻找对应的参数并传入,最终实现手动执行懒加载。下面是代码部分

js 复制代码
<template>
  <div>
    <el-table :data="tableData" style="width: 100%" row-key="id" border lazy :load="load"
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
      <el-table-column prop="date" label="日期" width="180">
      </el-table-column>
      <el-table-column prop="name" label="姓名" width="180">
      </el-table-column>
      <el-table-column prop="address" label="地址">
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        tableData: [{
          id: 1,
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          id: 2,
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1517 弄'
        }, {
          id: 3,
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1519 弄',
          hasChildren: true
        }, {
          id: 4,
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1516 弄'
        }],
        loadData: []
      }
    },
    methods: {
      load(tree, treeNode, resolve) {
        let flag = 0
        this.loadData.forEach((item) => {
          if(item.tree === tree){
            falg = 1
          }
        })
        if(flag === 0) this.load.push({tree, treeNode, resolve})
        setTimeout(() => {
          resolve([
            {
              id: 31,
              date: '2016-05-01',
              name: '王小虎',
              address: '上海市普陀区金沙江路 1519 弄'
            }, {
              id: 32,
              date: '2016-05-01',
              name: '王小虎',
              address: '上海市普陀区金沙江路 1519 弄'
            }
          ])
        }, 1000)
      }
    },
  }
</script>

这里使用懒加载使用的是定时器代替,在项目中一般都是用axios发请求获取数据之后渲染,在我们获取到load方法的参数之后,后续我们就可以在我们想调用懒加载时,在其他地方手动的调用load方法重新加载数据,比如在我们编辑或者删除子节点时,手动调用load并传入父节点的load参数。 总结一下这种方法就是一下几个步骤

1.首次调用load储存参数

2.对需要重新懒加载的操作时,调用laod方法并传入对应节点的load参数

就只需要这两步就可以实现手动调用load方法实现二次懒加载了。

方法二

第二种无需存储参数,它是直接调用table的ref对象中的方法进行刷新,但是这个方法在官方文档中并没有标注,只能自己去ref对象中调用。代码如下

js 复制代码
<template>
  <div>
    <el-table ref="tableRef" :data="tableData" style="width: 100%" row-key="id" border lazy :load="load"
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
      <el-table-column prop="date" label="日期" width="180">
      </el-table-column>
      <el-table-column prop="name" label="姓名" width="180">
      </el-table-column>
      <el-table-column prop="address" label="地址">
      </el-table-column>
      <el-table-column fixed="right" label="操作" width="120">
        <template #default = "scope">
          <el-button link type="primary" size="small" @click="refresh(scope.row)"
            >刷新</el-button
          >
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [{
        id: 1,
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        id: 2,
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        id: 3,
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄',
        hasChildren: true
      }, {
        id: 4,
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }],
      loadData: []
    }
  },
  methods: {
    load(tree, treeNode, resolve) {
      setTimeout(() => {
        resolve([
          {
            id: 31,
            date: '2016-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄'
          }, {
            id: 32,
            date: '2016-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄'
          }
        ])
      }, 1000)
    },
    handleDelete(){},
    refresh(row) { 
      const tableRef = this.$refs.tableRef
      // 设置该节点为未加载状态
      tableRef.store.states.treeData.value[row.id].loaded = false;
      // 加载并展开点击节点
      tableRef.store.loadOrToggle(row);
    }
  }
}
</script>

上面代码是直接可以运行的,就是有点简陋,你直接点击第三个有子节点的数据刷新,每次点击节点都会刷新。在实际项目中直接把laod中的逻辑改成获取子节点的逻辑就好了。

希望这篇文章对你有帮助。文章可能会有瑕疵,有问题可以在评论区提出哦

相关推荐
y先森32 分钟前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy32 分钟前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu108301891135 分钟前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿2 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡3 小时前
commitlint校验git提交信息
前端
虾球xz3 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇3 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒3 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员4 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐4 小时前
前端图像处理(一)
前端