当前位置: 首页 > news >正文

antd tree 懒加载+局部刷新

针对懒加载的树组件,节点数据发生变化后,只刷新局部数据,拿到最新的节点

思路

 antd tree提供的loadData属性,支持传入一个方法,用于异步加载子节点的数据。当某一节点的数据已经加载之后,收起节点再次展开是不会触发异步加载的方法的,因此节点数据不会刷新。需要我们手动变更一些值才能触发该方法。

首先要明确树组件触发懒加载的前提条件:

1. expandedKeys包含节点key值

2. loadedKeys不包含需要刷新的节点的key值,即此前未曾加载过

3. treeData中不包含该节点的children数据,即children=[]

只有以上三点同时满足,才会触发loadData方法。

方法

A节点下新增子节点后,刷新A节点的子节点需要3步:

注意:A节点的所有子孙节点均需要回到收起状态,否则会多次调用接口加载已展开的节点数据

  • 1. loadedKeys中移除A节点的key值和其子孙节点的key值
  • 2. treeData中将A节点的children赋空
  • 3. expandedKeys中移除A节点下的所有子孙节点的key值

代码:

// 获取当前节点id以及下面所有子孙节点的id 
getNodeAndChildrenIds (data) {
  let temp = [];
  const loop = (data) => {
    data.map(item => {
      temp.push(item.id)
      if (item.children && item.children.length) {
        loop(item.children);
      }
    })
  }

  loop(data);
  return temp;
},
// 更新树组件的数据
updateTreeData(id) {
  const temp = _.cloneDeep(this.treeData);
  let node;
  const loopFn = (data, id) => {
    if (node) {
       return;
    }
    data.some((item) => {
       if (item.id === id) {
         node = _.cloneDeep(item.children);
         item.children = [];
         return true;
       }
       if (item.children && item.children.length) {
         loopFn(item.children, id);
       }
     });
   };
   // 获取A节点的子节点,并把A节点的children移除
   loopFn(temp, id); 
   this.treeData = _.cloneDeep(temp);
   // 获取A节点下面所有子孙节点的id
   const nodeIds = this.getNodeAndChildrenIds(node);
   // loadedKeys中移除A节点的key
   let loadedKeys = _.cloneDeep(this.loadedKeys.filter(item => item !== id));
   // 去掉A下面已加载的子孙节点的key
   loadedKeys = _.cloneDeep(loadedKeys.filter(item => !nodeIds.includes(item)));
   this.loadedKeys = _.cloneDeep(loadedKeys);
   // 去掉A下面已展开的子孙节点id
   this.expandedKeys = _.cloneDeep(this.expandedKeys.filter(item => 
     !nodeIds.includes(item)));
}

 以上是刷新子节点的方法。

当A节点本身发生变更或删除时,则需要刷新A节点的数据,此时同样可以通过上面的方法。但是这里推荐另一种方式,即手动更新数据,不走接口,这种方式更为简单。

代码:

/** 找到对应的节点执行某操作 */
treeAction (node, id, fn) {
  node.some((item,index) => {
    if (item.id === id) {
      fn(node, item, index)
      return true;
    }
    if (item.children && item.children.length) {
      treeAction(item.children, id, fn);
    }
  });
},
// 删除树节点
async deleteTreeNode(data) {
      await api.deleteFn(data.id);
      this.$message.success('删除成功!');

      // 手动删除A节点和其子孙节点
      treeAction(this.treeData, data.id, (node, item, index) => {
        node.splice(index, 1);
      });
},
// 重命名树节点
async editTreeNode(data, form) {
      const params = {
        ...
      };
      await api.editFn(params);
      this.$message.success('重命名成功!');

      // 手动重置A节点名称
      treeAction(this.treeData, data.id, (node, item, index) => {
        item.name = form.name;
      });
},

相关文章:

  • c# RestClient 请求接口
  • 为了面试大厂,熬夜肝完这份 “测试” 笔记后,我终于“硬”了一回
  • T1095 数1的个数(信息学一本通C++)
  • 八、class 与 style 绑定(1)
  • 职言 | 编码是测试自动化职业生涯的关键:你准备好了吗?
  • 92-Java的缓冲流概述、体系、字节缓冲流使用
  • 检测网络框架越来越多
  • Gee引擎常用功能简介
  • 微信小程序 - - - - - 瀑布流效果实现
  • 前端面试问题(3)
  • 面试复习题二(综合类)
  • HCIA网络基础7-VRP和命令行基础
  • mybatis获取参数的两种方式: #{ } 和 ${ }
  • 为什么SDWAN成为了组网发展大趋势呢?
  • 谈谈什么是数据质量管理
  • [NodeJS] 关于Buffer
  • 2019.2.20 c++ 知识梳理
  • Apache的80端口被占用以及访问时报错403
  • C语言笔记(第一章:C语言编程)
  • DataBase in Android
  • Javascript基础之Array数组API
  • Rancher-k8s加速安装文档
  • 构建二叉树进行数值数组的去重及优化
  • 关于Java中分层中遇到的一些问题
  • 计算机在识别图像时“看到”了什么?
  • 三分钟教你同步 Visual Studio Code 设置
  • 什么软件可以剪辑音乐?
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • HanLP分词命名实体提取详解
  • MyCAT水平分库
  • python最赚钱的4个方向,你最心动的是哪个?
  • 带你开发类似Pokemon Go的AR游戏
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四) Graphivz 颜色选择
  • (一) springboot详细介绍
  • (转)关于多人操作数据的处理策略
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .net core 6 redis操作类
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net Web窗口页属性
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET轻量级ORM组件Dapper葵花宝典
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .net项目IIS、VS 附加进程调试
  • @我的前任是个极品 微博分析
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [1204 寻找子串位置] 解题报告
  • [Android]How to use FFmpeg to decode Android f...