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

解决el-tree子节点过多导致渲染缓慢问题

1、问题背景

在使用el-tree中,通常会调用后端接口从而去渲染tree。若后端返回数据量过于庞大,则会导致el-tree渲染缓慢的问题。此时我们通常会使用懒加载tree的方式,也就是点击某一个节点后去调取接口动态获取该节点的子数据。这种方式的确会对性能友好很多。但如果在节点数量在万级以上会有明显的卡顿,若数据量在五万以上可能会导致el-tree假死的情况。

2、解决方案

在市面上可能会有多种解决方案,我个人推荐 @wchbrad/vue-easy-tree这个包。这是一个作者结合el-tree结合虚拟滚动封装的的一个虚拟滚动tree组件,作者博客出处:

vue 实现 tree 树形大量数据的多功能虚拟滚动-Virtual Tree_Brad_chao的博客-CSDN博客_vue树形数据展示

下面是一篇虚拟滚动的文章。作者非常详细的介绍了虚拟滚动。

解决加载大量列表DOM导致浏览器性能瓶颈的虚拟滚动技术_程序员_Cc的博客-CSDN博客_虚拟滚动 

3、使用方式

使用npm下载:

npm install @wchbrad/vue-easy-tree

yarn下载

yarn add @wchbrad/vue-easy-tree

组件中进行引入:

import VueEasyTree from "@wchbrad/vue-easy-tree";
// 样式文件,可以根据需要自定义样式或主题
import "@wchbrad/vue-easy-tree/src/assets/index.scss"
 
export default {
  components: {
    VueEasyTree
  }
}

我使用vue-easy-tree的感觉就是兼容el-tree基本功能并支持大量数据虚拟滚动操作

5、demo演示

说明:通过一个小demo演示并对比el-tree与vue-easy-tree的渲染效率区别

如下图,通过两个按钮来对比两者之间的区别。base作为叶子节点数量。此时我将基数给予1w作为测试

<template>
  <div class="hello">
    <!-- vue-easy-tree  -->
    <el-button @click="()=>{
      isBlock=true 
      isBlock2 = false}"
    >vue-easy-tree</el-button>
    <!-- el-tree -->
    <el-button @click="()=>{
      isBlock2=true
      isBlock=false
      }">el-tree</el-button>

    <vue-easy-tree
      ref="veTree"
      node-key="id"
      height="calc(100vh - 30px)"
      :data="treeData"
      :props="props"
      v-if="isBlock"
    ></vue-easy-tree>

     <el-tree
      ref="veTree"
      node-key="id"
      height="calc(100vh - 30px)"
      :data="treeData"
      :props="props"
      v-if="isBlock2"
    ></el-tree>
  </div>
</template>
 
<script>
import VueEasyTree from "@wchbrad/vue-easy-tree";
// 样式文件,可以根据需要自定义样式或主题
import "@wchbrad/vue-easy-tree/src/assets/index.scss";
export default {
  name: "HelloWorld",
  components: {
    VueEasyTree,
  },
  data() {
    return {
      props: {
        label: "name",
        children: "children",
      },
        isBlock:false,
        isBlock2:false,
      treeData: [],
    };
  },
  created() {
    const data = [],
      root = 8,
      children = 3,
      base = 10000;
    for (let i = 0; i < root; i++) {
      data.push({
        id: `${i}`,
        name: `test-${i}`,
        children: [],
      });
      for (let j = 0; j < children; j++) {
        data[i].children.push({
          id: `${i}-${j}`,
          name: `test-${i}-${j}`,
          children: [],
        });
        for (let k = 0; k < base; k++) {
          data[i].children[j].children.push({
            id: `${i}-${j}-${k}`,
            name: `test-${i}-${j}-${k}`,
          });
        }
      }
    }
    this.treeData = data;
  },
};
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

 我们先看下el-tree:

如图 我们点击了节点后大概几秒中之后才展开所有节点。并且在收缩节点时也会有明显的卡顿

我们再看看vue-easy-tree的效果。无卡顿,我们通过控制台可以看出,el-tree渲染了所有节点,而虚拟滚动只渲染了可视区域的节点。所以不会卡顿。 

以上就是vue-easy-tree的用法。需要的小伙伴可以进行参考哦,仅供参考。业务场景不同需求也不同

相关文章:

  • Selenium-下拉选择框、弹出框、滚动条操作
  • 机器学习算法——K近邻算法详解
  • 禁忌搜索算法TS求解TSP问题
  • Chapter 6 CNN(Convolutional Neural Network)
  • 网课题库接口搭建教程
  • 时代落在英伟达身上的是粒什么沙,国产GPU的机会又在哪?
  • 【软件测试】什么?这是最全的--金融行业测试类型细分,宝藏干G货......
  • c++学习笔记3_函数模板的使用并实现自己定义的队列
  • 进程地址空间
  • 接口与接口间怎样通过嵌套创造出新的接口?
  • HFCTF-2021-Final-easyflask
  • 神经网络系统技术是什么,神经网络系统技术应用
  • java+SpringBoot+HTML+Mysq基于微信小程序的大咖读书系统的设计与实现
  • 前端周刊第三十四期
  • Maven私服搭建与使用:nexus,repository,mirror,distributionManagement
  • JS 中的深拷贝与浅拷贝
  • 2019.2.20 c++ 知识梳理
  • Centos6.8 使用rpm安装mysql5.7
  • css系列之关于字体的事
  • Flex布局到底解决了什么问题
  • GraphQL学习过程应该是这样的
  • idea + plantuml 画流程图
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java应用性能调优
  • magento 货币换算
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • PHP CLI应用的调试原理
  • Python十分钟制作属于你自己的个性logo
  • 排序(1):冒泡排序
  • 容器服务kubernetes弹性伸缩高级用法
  • Semaphore
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • ( 10 )MySQL中的外键
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (学习日记)2024.01.19
  • (转)c++ std::pair 与 std::make
  • (转)EXC_BREAKPOINT僵尸错误
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET 设计一套高性能的弱事件机制
  • .NetCore 如何动态路由
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • @vue/cli 3.x+引入jQuery
  • [ NOI 2001 ] 食物链
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [].slice.call()将类数组转化为真正的数组
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [20170705]diff比较执行结果的内容.txt
  • [2023-年度总结]凡是过往,皆为序章
  • [BetterExplained]书写是为了更好的思考(转载)
  • [Contest20180313]灵大会议