elementPlus + table 树形懒加载,子节点的刷新

需求描述

一个树形表格的增删查改

技术细节

刚开始想的很好,新增/编辑/删除时不调用接口,而是直接更改数据,如删除时,直接删除对应下标的数据
遇到的问题

  1. 实际业务中是否有子级,是不确定的-这个好解决,判断一下就行
  2. 通过load接口获取到的子项,使用proxy.$refs.table.store.states.lazyTreeNodeMap.value获取不到节点
  3. 通过proxy.$refs.table.store.states.treeData.value可以获取到节点数据,但是不能触发更新
  4. 最后使用了最简单的方式,新增,删除,编辑完成后,直接使用proxy.$refs.table.store.loadOrToggle(row)重新触发load调接口
<template>
  <div>

    <el-table :data="tableData1" style="width: 100%" row-key="id" border lazy :load="load"
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" ref="table">
      <el-table-column prop="date" label="Date" />
      <el-table-column prop="name" label="Name" />
      <el-table-column prop="address" label="Address" />
      <el-table-column prop="address" label="Address" width="270">
        <template #default="scope">
           <el-button type="primary" size="small" @click="handleAdd(scope.row)">
            add
          </el-button>
           <el-button type="primary" size="small" @click="handleAdd2(scope.row)">
            add2
          </el-button>
          <el-button size="small" @click="handleEdit(scope.row)">
            Edit
          </el-button>
          <el-button size="small" type="danger" @click="handleDelete(scope.row)">
            Delete
          </el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
<script setup>
import {onMounted,ref,getCurrentInstance} from 'vue';
const {proxy} = getCurrentInstance();

const handleEdit = ((row) => {
  console.log(row)
})
const handleDelete = ((row) => {
  console.log(row)
})
const handleAdd = ((row) => {
console.log(proxy.$refs.table.store.states.treeData.value)
console.log(proxy.$refs.table.store.states.lazyTreeNodeMap.value)
 // proxy.$refs.table.store.states.treeData.value[row.id].loaded = false;
  proxy.$refs.table.store.states.treeData.value[row.id].loaded = false
  proxy.$refs.table.store.loadOrToggle(row)
})
const handleAdd2 = ((row) => {
  
})
const load = (
  row,
  treeNode,
  resolve
) => {
  console.log(row)
  setTimeout(() => {
    resolve([
      {
        id: `${row.id}_31`,
        date: '2016-05-01',
        name: 'wangxiaohu',
        address: 'No. 189, Grove St, Los Angeles',
        hasChildren: true,
      },
      {
        id: `${row.id}_32`,
        date: '2016-05-01',
        name: 'wangxiaohu',
        address: 'No. 189, Grove St, Los Angeles',
        hasChildren: true,
      },
    ])
  }, 1000)
}


const tableData1 = [
  {
    id: 11,
    date: '2016-05-02',
    name: 'wangxiaohu',
    address: 'No. 189, Grove St, Los Angeles',
    hasChildren: true,
  },
  {
    id: 2,
    date: '2016-05-04',
    name: 'wangxiaohu',
    hasChildren: true,
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    id: 3,
    date: '2016-05-01',
    name: 'wangxiaohu',
    hasChildren: true,
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    id: 4,
    date: '2016-05-03',
    name: 'wangxiaohu',
    hasChildren: true,
    address: 'No. 189, Grove St, Los Angeles',
  },
]
</script>

小结

关键点在于:proxy.$refs.table.store.loadOrToggle(row)

### ElementUI中el-table组件实现树形结构懒加载刷新子节点的方法 在ElementUI的`el-table`组件中,可以通过设置`tree-props`属性来实现树形结构,并结合懒加载功能动态加载子节点数据。以下是一个完整的解决方案,包括示例代码和实现方法。 #### 1. 基本配置 为了实现树形结构的懒加载,需要为`el-table`组件设置`row-key`属性和`lazy`属性,并指定`load`方法用于加载子节点数据。以下是基本配置: ```vue <el-table :data="tableData" style="width: 100%" row-key="id" lazy :load="loadTree" border> <el-table-column prop="name" label="名称"></el-table-column> </el-table> ``` - `row-key="id"`:指定每一行数据的唯一标识。 - `lazy`:启用懒加载模式。 - `:load="loadTree"`:定义加载子节点数据的方法[^3]。 #### 2. 加载子节点数据 `loadTree`方法会在用户展开某个节点时被调用,该方法的第一个参数是当前节点的数据对象,第二个参数是一个回调函数,用于返回子节点数据。 ```javascript methods: { loadTree(row, treeNode, resolve) { // 模拟异步加载子节点数据 setTimeout(() => { const children = [ { id: row.id * 10 + 1, name: `${row.name}-子节点1`, hasChildren: true }, { id: row.id * 10 + 2, name: `${row.name}-子节点2`, hasChildren: false } ]; resolve(children); // 调用resolve传递子节点数据 }, 500); } } ``` - `row`:当前节点的数据对象。 - `treeNode`:树节点的相关信息(通常不需要使用)。 - `resolve`:回调函数,用于返回子节点数据[^4]。 #### 3. 局部刷新子节点 如果需要在新增、修改或删除子节点刷新树形结构中的某一部分,可以通过重新调用`loadTree`方法实现局部刷新。例如: ```javascript refreshTreeNode(row) { this.$refs.table.store.loadOrToggle(row); // 触发节点的加载逻辑 } ``` - `this.$refs.table.store.loadOrToggle(row)`:手动触发指定节点的加载逻辑,适用于更新后的局部刷新[^5]。 #### 4. 示例代码 以下是一个完整的示例代码,展示了如何实现`el-table`组件的树形结构懒加载及局部刷新功能。 ```vue <template> <div> <el-button @click="addNode">新增子节点</el-button> <el-table ref="table" :data="tableData" style="width: 100%" row-key="id" lazy :load="loadTree" border> <el-table-column prop="name" label="名称"></el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [ { id: 1, name: "根节点1", hasChildren: true }, { id: 2, name: "根节点2", hasChildren: true } ] }; }, methods: { loadTree(row, treeNode, resolve) { setTimeout(() => { const children = [ { id: row.id * 10 + 1, name: `${row.name}-子节点1`, hasChildren: true }, { id: row.id * 10 + 2, name: `${row.name}-子节点2`, hasChildren: false } ]; resolve(children); }, 500); }, addNode() { const newNode = { id: Math.random(), name: "新增节点", hasChildren: false }; this.tableData.push(newNode); this.refreshTreeNode(newNode); }, refreshTreeNode(row) { this.$refs.table.store.loadOrToggle(row); } } }; </script> ``` #### 5. 注意事项 - 确保`row-key`属性的值在所有数据中唯一,否则可能导致树形结构异常[^6]。 - 如果需要对整个树进行刷新,可以清空`tableData`并重新赋值[^7]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值