el-tree 懒加载数据,增删改时局部刷新实现

1.数据过多时进行懒加载孩子节点,根据层级传参获取后端孩子数据

懒加载主要部分:

1参数:

:load="loadNode"

lazy

:props="defaultProps"

2.defaultProps 需要设置isLeaf: 'isLeaf',去除最后一层孩子节点的展开图表

defaultProps: {

children: 'children',

label: 'label',

isLeaf: 'isLeaf'

},

2.增删改时实现局部刷新

主要思路:将展开的层级的node保存当curNode中,在进行添加刷新后调用partialRefreshpartialRefresh()方法【下面代码】

partialRefreshpartialRefresh (node) {

this.mark = true

node.loaded = false // 设置loaded为false;模拟一次节点展开事件,加载重命名后的新数据;

node.expand() // 新建子节点是刷新一次本节点的展开请求,而重命名和删除则需要刷新父级节点的

的展开事件,可以设置node.parent.loaded = false;node.parent.expand();

},

完整案例代码(没和后端交互)

复制代码
<template>
  <div>
    树形懒加载 
    局部刷新:添加或者删除节点时,后端需要返回当前节点下的最新的孩子数据
   <el-tree
   :props="defaultProps"
   :data="data"
   :load="loadNode"
    lazy
    :expand-on-click-node="false"
    :check-on-click-node="true"
    @node-click="nodeClick"
  >
 
</el-tree>
 <el-button @click="add">添加局部数据</el-button>
 <el-button @click="deletes">删除局部刷新</el-button>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        nodeArr:[],
        mark:false,
        delete:false,
        curPath:'',
        curNode:'',
        defaultProps: {
          children: 'children',
          label: 'label',
          isLeaf: 'isLeaf'
        },
        data: [{
          label: '一级 1',
          filedId:'dddd',
          children:[{}]
        
        }, {
          label: '一级 2',
          children:[{}]
        
          }, {
            label: '二级 2-2',
            children:[{}]
          }],
      };
    },
    methods: {
      // 模拟删除
      deletes() {
        this.delete=true
       this.partialRefreshpartialRefresh(this.curNode)
      },
      // 模拟添加数据,
      add() {
          this.partialRefreshpartialRefresh(this.curNode)
      },

      nodeClick (data, node) {
        console.log('node',node);
        this.curNode = node
      },
      // 删除

      // 实现局部刷新,在点击弹窗处调用的
    partialRefreshpartialRefresh (node) {
      this.mark = true
      node.loaded = false // 设置loaded为false;模拟一次节点展开事件,加载重命名后的新数据;
      node.expand() // 新建子节点是刷新一次本节点的展开请求,而重命名和删除则需要刷新父级节点的 
        的展开事件,可以设置node.parent.loaded = false;node.parent.expand();
    },
    loadNode(node, resolve) {
        console.log('nodexx',node);
        
        this.curNode = node
        if (node.level === 0) {
          return resolve(this.data);
        }
        if (node.level >= 1) {
          // 设置定时器模拟接口返回孩子数据
          setTimeout(() => {
          node.data.children.pop();
          node.data.children = []
          // 模拟添加的
          // if(this.mark) {
          //   // 模拟添加数据,真正开发应该是后端将当前节点孩子数据返回
          //   node.data.children.push(
          //   {
          //   label: '新添加的孩子',
          //   filedId:'wwww',
          //   isLeaf:true,
          // },
          // {
          //   label: '初始的孩子',
          //   filedId:'wwww',
          //   isLeaf:true,
          // },
          // {
          //   label: '二级 3-2',
          //   filedId:'wwww',
          //   children:[{}]
          // })
          // } else {
          // node.data.children.pop();
          // node.data.children.push({
          //   label: '初始的孩子',
          //   filedId:'wwww',
          //   isLeaf:true,
          // },
          // {
          //   label: '二级 3-2',
          //   filedId:'wwww',
          //   children:[{}]
          // })
          // }
          // 模拟删除
            if(this.delete) {
            // 模拟删除数据,真正开发应该是后端将当前节点孩子数据返回
            node.data.children.push(
          //   {
          //   label: '新添加的孩子',
          //   filedId:'wwww',
          //   isLeaf:true,
          // },
          // {
          //   label: '初始的孩子',
          //   filedId:'wwww',
          //   isLeaf:true,
          // },
          {
            label: '二级 3-2',
            filedId:'wwww',
            children:[{}]
          })
          } else {
          node.data.children.pop();
          node.data.children.push({
            label: '初始的孩子',
            filedId:'wwww',
            isLeaf:true,
          },
          {
            label: '二级 3-2',
            filedId:'wwww',
            children:[{}]
          })
          }
          resolve(node.data.children)
          },3000)
        }
     
      }
    }
  };
</script>

<style>

</style>
相关推荐
哀木18 小时前
一个简单的套壳方案,就能让你的 Agent 少做重复初始化
前端
问心无愧051318 小时前
ctf show web入门27
前端
小村儿18 小时前
给 AI Agent 装上"长期记忆":Karpathy 的 LLM Wiki 思想,我做成了工具
前端·后端·ai编程
竹林81819 小时前
用ethers.js连接MetaMask实现Web3钱包登录:从踩坑到稳定运行的完整记录
前端·javascript
heyCHEEMS19 小时前
如何用 Recast 实现静态配置文件源码级读写
前端·node.js
心连欣19 小时前
从零开始,学习所有指令!
前端·javascript·vue.js
review4454319 小时前
大模型和function calling分别是如何工作的
前端
东东同学19 小时前
耗时一个月,我把 Nuxt 首屏性能排障经验做成了一个 AI Skill
前端·agent
冴羽20 小时前
超越 Vibe Coding —— AI 辅助编程指南
前端·ai编程·vibecoding
梦想的颜色20 小时前
一天一个SKILL——前端最佳自动化测试 webapp-testing
前端·web app