详解如何实现Element树形控件Tree在懒加载模式下的动态更新


Posted in Javascript onApril 25, 2019

Element提供的Tree树形控件,可以用清晰的层级结构展示信息,还可以展开或折叠。Tree支持两种加载模式:一次性加载全部树节点和懒加载模式。所谓懒加载模式,是指当需要展开父节点时才渲染子节点。懒加载模式的应用场景适合树节点数据量大的情形,在一定程度上可以优化图形用户界面的响应效率以及提升用户体验。但是,懒加载模式对数据动态刷新应用需求的支持不尽如意。树形控件节点一旦展开就缓存在本地,后续不会再继续更新和刷新节点数据。本文将介绍如何实现Element树形控件Tree在懒加载模式下的动态更新。具体需求如下图所示:

详解如何实现Element树形控件Tree在懒加载模式下的动态更新

动态更新需求

当Select选择器选择箱变、逆变器、汇流箱或组串等类型时,Tree树形控件会动态刷新显示相应类型的设备名称。我们知道在懒加载模式下,Tree树形控件节点一旦展开,就不再重新加载节点数据。那么如何实现在选择不同类型时动态刷新树形控件节点数据显示呢?一种实现思路是在Select选择器发生变化时,在change事件中清空Tree树形控件的全部子节点,然后再重新加载树形控件节点数据。关键代码如下图所示:

详解如何实现Element树形控件Tree在懒加载模式下的动态更新

清空树形控件节点

首先,通过树形控件的父节点清空所有子节点数据,然后调用loadNode1方法重新构建树形控件懒加载数据。loadNode1是树形控件load属性指定的加载树的方法,该方法在加载树或者展开某个节点时会被自动调用。

我们可以看到,传递给loadNode1方法有两个参数,this.node和this.resolve,这两个参数都是树形控件顶层节点属性数值。那么,是如何获取到这两个参数数值的呢?具体方法是:首先,申明node和reslove两个变量用于保存顶层节点的node和reslove数值。然后,在树形控件加载时将node.level===0情况下的node和reslove数值保存。如下图所示:

详解如何实现Element树形控件Tree在懒加载模式下的动态更新

获取顶层节点

loadNode1内部是通过reslove方法,将数据逐级推至树形控件数据结构中的。先执行reslove方法的数据是父节点,后执行reslove方法的数据是子节点,在无子节点的情况下通过调用reslove([])实现。

结束语:至此,实现了Element的Tree树形控件懒加载模式下的节点数据动态更新。在子节点数据量大的情况下,懒加载和动态更新机制,在一定程度上解决了响应效率问题,也提升了用户体验。

补充:element ui 懒加载树节点内子项的动态更新

<el-tree
 :props="props1"
 :load="loadNode1"
 lazy
 show-checkbox>
</el-tree>
 
<script>
 export default {
  data() {
   return {
    props1: {
     label: 'name',
     children: 'zones',
     isLeaf: 'leaf'
    },
   };
  },
  methods: {
   loadNode1(node, resolve) {
    if (node.level === 0) {
     return resolve([{ name: 'region' }]);
    }
    if (node.level > 1) return resolve([]);
 
    setTimeout(() => {
     const data = [{
      name: 'leaf',
      leaf: true
     }, {
      name: 'zone'
     }];
 
     resolve(data);
    }, 500);
   }
  }
 };
</script>

上面代码是element ui官方树懒加载的实例。实现就是添加lazy,绑定一个load属性,点击节点的时候,就会触发loadNode1的方法,将数据刷到点击的节点里面。

这里的问题是:如果该节点load过数据,再次点击是不会触发loadNode1这个方法的,但是这个节点下的子节点也许会动态增加或者删除

解决的思路是:

1、得到选中的节点

2、将选中节点的子节点全部删除

3、将选中节点的子节点数据手动刷到该节点内

我查过element ui源码,这里用到源码内的方法,所以我们实现下来很方便,只要三行代码

function refreshLazyTree(node, children) {
 var theChildren = node.childNodes
 theChildren.splice(0, theChildren.length)
 node.doCreateChildren(children)
}

1、node就是选中的的节点(也就是点击展开的节点),你可以通过element ui里的getNode方法获得,也可以直接监听@node-click事件直接获取选中的节点。

2、children就是node这个节点的子项

3、通过splice方法删除node节点下的所有子项

4、调用doCreateChildren创建子项就ok了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
巧妙破除网页右键禁用的十大绝招
Aug 12 Javascript
仿新浪微博登陆邮箱提示效果的js代码
Aug 02 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
Jan 11 Javascript
jQuery中:first选择器用法实例
Dec 30 Javascript
js实现字符串和数组之间相互转换操作
Jan 12 Javascript
详解AngularJS验证、过滤器、指令
Jan 04 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
Feb 14 Javascript
node实现的爬虫功能示例
May 04 Javascript
vue.js删除列表中的一行
Jun 30 Javascript
详解从Vue-router到html5的pushState
Jul 21 Javascript
JavaScript运动原理基础知识详解
Apr 02 Javascript
一篇文章看懂JavaScript中的回调
Jan 05 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
Apr 25 #Javascript
微信小程序整合使用富文本编辑器的方法详解
Apr 25 #Javascript
微信小程序实现的五星评价功能示例
Apr 25 #Javascript
微信小程序实现单列下拉菜单效果
Apr 25 #Javascript
Vue组件通信的几种实现方法
Apr 25 #Javascript
深入解析vue 源码目录及构建过程分析
Apr 24 #Javascript
使用webpack4编译并压缩ES6代码的方法示例
Apr 24 #Javascript
You might like
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
详解php协程知识点
2018/09/21 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
PDO实现学生管理系统
2020/03/21 PHP
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
javascript校验价格合法性实例(必须输入2位小数)
2014/05/05 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
浅谈python jieba分词模块的基本用法
2017/11/09 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
Django models文件模型变更错误解决
2020/05/11 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
药学专业大学生个人的自我评价
2013/11/04 职场文书
考察现实表现材料
2014/05/19 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
Python实现机器学习算法的分类
2021/06/03 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python