el-tree树组件的懒加载写法步骤

孙闿
• 阅读 9034
树结构在项目中其实还是比较常见的,本篇文章以饿了么UI中的el-tree组件为例,讲述一下树组件的懒加载的实现步骤。当然,顺带吐槽一下官方文档的案例写的不太接地气

问题描述

树组件如果数据比较多的话,一次性把整棵树的数据都请求到,略有耗时。所以为了优化性能,我们就要实现树组件懒加载的效果,也就是当我们点击树节点的时候,再去向后端发请求,获取对应点击的树节点下的数据。这样的话,点击哪里,加载哪里,性能会提高不少。

效果图

我们先看一下最终的成品效果图
el-tree树组件的懒加载写法步骤

懒加载前端代码

html部分

<template>
  <div class="box">
    <div class="leftBox">
      <el-tree lazy :load="loadNode" :props="props" node-key="id">
      </el-tree>
    </div>
  </div>
</template>

js部分

<script>
export default {
  data() {
    return {
      props: {
        label: "name",
        isLeaf: "isLeaf",
      },
    };
  },
  methods: {
    loadNode(node, resolve) {
      //如果展开第一级节点,从后台加载一级节点列表
      if (node.level == 0) {
        this.loadfirstnode(resolve);
      }
      //如果展开其他级节点,动态从后台加载下一级节点列表
      if (node.level >= 1) {
        this.loadchildnode(node, resolve);
      }
    },
    //加载第一级节点
    async loadfirstnode(resolve) {
      let params = {
        level: 0,
      };
      const res = await this.$api.getTreeData(params);
      return resolve(res.data);
    },
    //加载节点的子节点集合
    async loadchildnode(node, resolve) {
      // console.log("超过二级的", node, node.level);
      let params = {
        id: node.key,
      };
      const res = await this.$api.getTreeChildData(params);
      return resolve(res.data);
    },
  },
};
</script>

思路分析

首先,使用el-tree树组件必须指定lazy和load属性

  • lazy告知树组件开启懒加载模式,加上即可
  • load绑定的是一个函数,这个函数主要是用来在页面初始化加载的时候,用于向后端发请求获取el-tree的树结构的数据的。页面初始化加载,load绑定的函数会自动执行
注意,如果树组件开启了懒加载模式,就不用在el-tree组件标签中写:data="data属性了,因为load绑定的函数,有两个参数,node和resolve,node是树节点,而resolve又是一个函数,相当于高阶函数(函数柯里化)了,我们只需要把后端返回的数据(单层数组结构),放在这个函数里面,这个函数会自动把数据传递到树组件里面去,同时渲染视图

然后,我们需要和后端约定好传递的数据结构,即props中的配置

本例中是一个便于理解的简单el-tree的demo,所以就按照最简单的配置书写

  • data中的props中的label属性,就是平常指定的节点的名字,这个不赘述
  • data中的props中的isLeaf属性,指定的则是:是否是树组件中的叶子节点。什么是叶子节点?我们知道一棵树有很多分支(树枝),而树枝的末梢则是叶子,所以叶子节点就是树节点的最内层,最里层。所以,我们需要和后端沟通,让后端返回的树结构数据中,最内层数据加上isLeaf属性布尔值,为true就代表是最内层,为false,或者不加这个属性,就代表不是最内层。对应树组件的页面效果就是:为true的树组件,最内层不会有三角箭头。即到底了,没懒加载了
注意,因为树组件的懒加载是,点击树组件节点,加载下一层的数据,所以要和后端同事沟通,让后端接口数据不要一次性的返回整个树结构的数据,而是分层返回,点击那个树节点,树节点数据中会有id的,根据id发请求到后端,后端再把对应数据返回给前端,是数组结构的数据

接下来说说发请求这一块

因为树组件的load属性绑定的函数,初始化就会加载发请求,又因为树组件可以分为最外层和非最外层,所以在load绑定的函数中,本例是loadNode函数里面发请求,可以分两类:最外层和非最外层。(最外层level为0,非最外层levle大于0)所以就会有如下代码:

loadNode(node, resolve) {
  console.log('node节点数据记录了很多信息',node);
  console.log('resolve高阶函数给树组件赋值',node);
  //如果展开第一级节点,从后台加载一级节点列表(固定的)
  if (node.level == 0) {
    this.loadfirstnode(resolve);
  }
  //如果展开其他级节点,动态从后台加载下一级节点列表(可变的)
  if (node.level >= 1) {
    this.loadchildnode(node, resolve);
  }
},

我们打印node参数和resolve参数,发现分别是树节点和一个函数,树节点记录了很多信息,其中就有树的层级

node参数打印效果图

el-tree树组件的懒加载写法步骤

resolve参数打印效果图

el-tree树组件的懒加载写法步骤

最后注意后端返回的数据结构

初始化加载最外层西游记和三国演义节点

el-tree树组件的懒加载写法步骤

点击西游记加载孙悟空、猪八戒、沙和尚节点

el-tree树组件的懒加载写法步骤

完整代码地址

附上Gitee完整代码,方便大家理解,里面分为简化版的el-tree和优化版的el-tree

https://gitee.com/ah-shuai/de...

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Easter79 Easter79
4年前
vue 路由懒加载
原文链接: vue路由懒加载(https://my.oschina.net/ahaoboy/blog/1796979)路由懒加载当打包构建应用时,Javascript包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。结合Vue的异步组件
Easter79 Easter79
4年前
vue 路由 懒加载
原文链接: vue路由懒加载(https://my.oschina.net/ahaoboy/blog/1618024)路由懒加载当打包构建应用时,Javascript包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。结合Vue的异步组
徐小夕 徐小夕
5年前
《精通react/vue组件设计》之5分钟教你实现一个极具创意的加载(Loading)组件
前言本文是笔者写组件设计的第八篇文章,今天带大家用5分钟实现一个极具创意的加载(loading)组件.涉及的核心知识点主要是css3相关特性,如果大家非常熟悉,可直接跳过介绍直接看正文.时刻问自己:是否具备创造力?笔记前端组件的一般分类:通用型组件:比如Button,Icon等.布局型组件:比如Grid,Layout布
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Stella981 Stella981
4年前
React TypeScript 从零实现 Popup 组件发布到 npm
本文转载自掘金《从0到1发布一个Popup组件到npm》,作者「海秋」。点击下方阅读原文去点个赞吧!上篇文章\1\中介绍了如何从0到1搭建一个React组件库架子,但为了一两个组件去搭建组件库未免显得大材小用。这次以移动端常见的一个组件Popup为例,以最方便快捷的形式发布一个流程完整的npm包。
Stella981 Stella981
4年前
Angular性能优化实践——巧用第三方组件和懒加载技术
应该有很多人都抱怨过Angular应用的性能问题。其实,在搭建Angular项目时,通过使用打包、懒加载、变化检测策略和缓存技术,再辅助第三方组件,便可有效提升项目性能。为了帮助开发者深入理解和使用Angular,本文将以我司客户中最为典型的业务场景——在线表格编辑为例,演示如何借助懒加载技术,在基于Angular的框架中实现在线导入导出Excel
taskbuilder taskbuilder
1年前
TaskBuilder数据添加页面前后端交互原理解析
在TaskBuilder内打开学员管理项目前端文件里的add.tfp页面,下面以这个文件为例介绍一下数据添加页面如何实现前后端的数据交互。如果要将页面里输入项的数据提交到后台,需要将这些输入项都放到表单组件中,然后通过表单组件实现数据的统一提交,具体原理如
GeorgeGcs GeorgeGcs
8个月前
【HarmonyOS】Web 组件的 PDF 文档预览功能详解
【HarmonyOS】Web组件的PDF文档预览功能详解一、前言应用开发中,PDF文档预览是一项常见需求。虽然官方提供了预览组件,但是在H5业务场景下,如何加载PDF呢?此时就需要Web组件提供了便捷的PDF预览能力。目前官方的ArkWeb,支持加载网络、
孙闿
孙闿
Lv1
没有期待的日子反而顺顺利利。
文章
3
粉丝
0
获赞
0