1.问题的来源

在Element中使用Table树形数据懒加载(设置 lazy 属性为 true)模式。框架会通过row-key指定的属性来缓存操作者异步请求的数据 ,所以我们进行删除或编辑操作后重新请求数据,框架会优先通过row-key指定的id来检查是否已存在,如果数据存在使用旧数据,如果数据不存在使用新数据,所以table中查看更新后的数据发生没有变化。下面是实际演示例子:

  • 代码:
<template>
  <el-table
    ref="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-column
      label="编辑"
      width="120"
    >
      <el-button @click="handleQuery">查询</el-button>
    </el-table-column>
  </el-table>
</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)
    },
    handleQuery() {
    // lazyTreeNodeMap:数据缓存的对象
      console.log(this.$refs.table.store.states.lazyTreeNodeMap)
    }
  }
}
</script>
  1. 官方描述
    在这里插入图片描述
    2.未进行二级项的数据请求,获取lazyTreeNodeMap未缓存数据
    在这里插入图片描述

3.异步加载二级项后,通过点击查询获取lazyTreeNodeMap缓存了异步请求的数据{3:[]}在这里插入图片描述

2.解决方案:

  1. 当我们进行删除或编辑操作后,可以清空lazyTreeNodeMap缓存的数据。当用户重新获取数据渲染时,由于lazyTreeNodeMap缓存的数据不存在了,框架就会渲染最新的。
methods: {
	// 定义一个方法,便于重复使用
	resetLazyTree() {
		// $refs.table 在<el-table ref="table">中定义
		this.$set(this.$refs.table.store.states, 'lazyTreeNodeMap', {})
	},
	delete() {
		// 你要执行的代码
		// 操作成功后
		this.resetLazyTree()
		...
		// 通过接口获取最新的数据
		...
	},
	update() {
		// 你要执行的代码
		// 操作成功后
		...
		this.resetLazyTree()
		// 通过接口获取最新的数据
		...
	}
}
Logo

前往低代码交流专区

更多推荐