• 解决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

    组件中进行引入:

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

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

    5、demo演示

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

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

    1. <template>
    2. <div class="hello">
    3. <!-- vue-easy-tree -->
    4. <el-button @click="()=>{
    5. isBlock=true
    6. isBlock2 = false}"
    7. >vue-easy-tree</el-button>
    8. <!-- el-tree -->
    9. <el-button @click="()=>{
    10. isBlock2=true
    11. isBlock=false
    12. }">el-tree</el-button>
    13. <vue-easy-tree
    14. ref="veTree"
    15. node-key="id"
    16. height="calc(100vh - 30px)"
    17. :data="treeData"
    18. :props="props"
    19. v-if="isBlock"
    20. ></vue-easy-tree>
    21. <el-tree
    22. ref="veTree"
    23. node-key="id"
    24. height="calc(100vh - 30px)"
    25. :data="treeData"
    26. :props="props"
    27. v-if="isBlock2"
    28. ></el-tree>
    29. </div>
    30. </template>
    31. <script>
    32. import VueEasyTree from "@wchbrad/vue-easy-tree";
    33. // 样式文件,可以根据需要自定义样式或主题
    34. import "@wchbrad/vue-easy-tree/src/assets/index.scss";
    35. export default {
    36. name: "HelloWorld",
    37. components: {
    38. VueEasyTree,
    39. },
    40. data() {
    41. return {
    42. props: {
    43. label: "name",
    44. children: "children",
    45. },
    46. isBlock:false,
    47. isBlock2:false,
    48. treeData: [],
    49. };
    50. },
    51. created() {
    52. const data = [],
    53. root = 8,
    54. children = 3,
    55. base = 10000;
    56. for (let i = 0; i < root; i++) {
    57. data.push({
    58. id: `${i}`,
    59. name: `test-${i}`,
    60. children: [],
    61. });
    62. for (let j = 0; j < children; j++) {
    63. data[i].children.push({
    64. id: `${i}-${j}`,
    65. name: `test-${i}-${j}`,
    66. children: [],
    67. });
    68. for (let k = 0; k < base; k++) {
    69. data[i].children[j].children.push({
    70. id: `${i}-${j}-${k}`,
    71. name: `test-${i}-${j}-${k}`,
    72. });
    73. }
    74. }
    75. }
    76. this.treeData = data;
    77. },
    78. };
    79. </script>
    80. <!-- Add "scoped" attribute to limit CSS to this component only -->
    81. <style scoped>
    82. </style>

     我们先看下el-tree:

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

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

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

  • 相关阅读:
    【2023】基于docker 实现部署jar包项目(包括单个和多个一起部署)
    org.springframework.util.AntPathMatcher Ant 样式路径模式的 PathMatcher实现
    MIPI I3C协议
    《Go Web 编程》之第1章 Go与Web应用
    用Qt实现一个计算器demo
    异常处理 android.os.NetworkOnMainThreadException
    前端面试题总结
    Linux centos7.0搭建Java开发环境(保姆级教程)
    Tomcat报BAD packet signature 18245错误的原因
    【QT】Qt Creator生成动态库(DLL)并调用
  • 原文地址:https://blog.csdn.net/m0_52765288/article/details/126689328