详解如何实现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 相关文章推荐
javascript编程起步(第七课)
Feb 27 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
Apr 27 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
Jan 30 Javascript
AngularJs  E2E Testing 详解
Sep 02 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
Oct 18 Javascript
vue实现手机号码抽奖上下滚动动画示例
Oct 18 Javascript
vue中动态添加class类名的方法
Sep 05 Javascript
Vue实现固定定位图标滑动隐藏效果
May 30 Javascript
layui 对table中的数据进行转义的实例
Sep 12 Javascript
微信小程序如何实现五星评价功能
Oct 15 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
Jan 18 Javascript
ES2020让代码更优美的运算符 (?.) (??)
Jan 04 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
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
Pycharm保存不能自动同步到远程服务器的解决方法
2019/06/27 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
python 多进程队列数据处理详解
2019/12/23 Python
Python Django搭建网站流程图解
2020/06/13 Python
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
教师业务学习制度
2014/01/25 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
会议主持词通用版
2019/04/02 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记