Vue使用z-tree处理大数量的数据以及生成树状结构

 更新时间:2024年04月26日 08:43:28   作者:球球和皮皮  
这篇文章主要介绍了Vue使用z-tree处理大数量的数据以及生成树状结构方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、简介

效果展示:

应用场景是这样的:后台给我返回的数据是处理好层级的数据,包含关系是通过数据里的children属性。

举个例子:

{
	label: '汽车',
	value: 'car',
	children: [
		{
			label: '大众',
			value: 'das'
		},
		{
			label: '丰田',
			value: 'Toyota'
		}
	]
}

大体就是这种类型的数据,但是,问题是数据量特别大,有上万条;而且层级数不固定,层数可能很多。

最开始拿到这个问题的时候,我用的是element组件库的el-tree,因为el-tree很容易上手,而且也支持这种多层数据的展示,还可以添加checkbox等等,完全可以满足功能要求。

但是用el-tree实现之后,发现渲染时间有时长达十秒,而且经常浏览器卡死,最后不得不放弃el-tree组件,替换其他性能更好的树形结构组件。

二、引入z-tree

1、引入方法(Vue中)

<div class="ztree-wrap">
   <ul id="treeZyType" ref="ztree" class="ztree"></ul>
 </div>
import "@/components/Ztree/js/jquery-1.4.4.min.js"
import "@/components/Ztree/js/jquery.ztree.core.js"
import "@/components/Ztree/js/jquery.ztree.excheck.js"
// source是从后台获取的数据,层级结构已经处理好。
jsonToTree(source) {
   var setting = {
     check: {
       enable: true,
       chkboxType: { "Y": "", "N": "s" }
     },
     data: {
       key: {
           name: "name"
       },
       simpleData: {
         enable: false,
         idKey: "id",
         pIdKey: "parentId",
         rootPId: null
       }
     },
     view: {
       fontCss: {size: "20px"}
     }
   };
   $.fn.zTree.init($("#treeZyType"), setting, source);
 }
<style lang="scss" scoped>
@import url("../../components/Ztree/css/zTreeStyle/zTreeStyle.css");
</style>

注意:

  • 由于z-tree依赖于Jqurey,所以需要同时引入Jquery。
  • 为了避免版本变更带来的bug,我把z-tree组件放到了component中。chkboxType: { “Y”: “”, “N”: “s” }属性用来设置checkbox的关联关系。
  • 具体查看官网z-tree的样式也要引入进来

2、下载:

https://www.treejs.cn/v3/main.php#_zTreeInfo

3、扩展(使用自定义图标):

由于我展示锁定和非锁定的状态,所以我用了自定义的图标。

改写的位置在jquery.ztree.core.js文件下,makeNodeIcoStyle函数。

makeNodeIcoStyle: function (setting, node) {
   var icoStyle = [];
   if (!node.isAjaxing) {
     var isParent = data.nodeIsParent(setting, node);
     var icon = (isParent && node.iconOpen && node.iconClose) ? (node.open ? node.iconOpen : node.iconClose) : node[setting.data.key.icon];
     if (icon) {
       icoStyle.push("background:url(", icon, ") 0 0 no-repeat;");
     } else {
     	// 判断数据属性,根据属性使用特定图标
       if (node.lockStatus === 1) {
         icoStyle.push("background:url(", "/img/lock.png", ") 0 0 no-repeat;");
       } else if (node.lockStatus === 0 || node.lockStatus === 3){
         icoStyle.push("background:url(", "/img/unlock.png", ") 0 0 no-repeat;");
       }
     }
     if (setting.view.showIcon == false || !tools.apply(setting.view.showIcon, [setting.treeId, node], true)) {
       icoStyle.push("width:0px;height:0px;");
     }
   }
   return icoStyle.join('');
 },

三、z-tree中的原生方法

1、折叠和展开

// 获取到z-tree对象
const zTree = $.fn.zTree.getZTreeObj("treeZyType");
// state为折叠展开状态,true为展开,false为折叠。
zTree.expandAll(state);

2、checkbox状态下的全选

// 获取到z-tree对象
const zTree = $.fn.zTree.getZTreeObj("treeZyType");
// state为选中状态,true为全选,false为取消全选。
zTree.checkAllNodes(state);

3、获取选中的节点

// 获取到z-tree对象
const zTree = $.fn.zTree.getZTreeObj("treeZyType");
// 获取选中的节点
const zyTypeNode = zTree.getCheckedNodes(true);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一键将Word文档转成Vue组件mammoth的应用详解

    一键将Word文档转成Vue组件mammoth的应用详解

    这篇文章主要为大家介绍了一键将Word文档转成Vue组件mammoth的应用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • vue 微信授权登录解决方案

    vue 微信授权登录解决方案

    这篇文章主要介绍了vue 微信授权解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Vue3组件通信的具体用法实例

    Vue3组件通信的具体用法实例

    在Vue.js3中,组件通信主要包括父子组件通信、兄弟组件通信以及祖孙组件通信,这篇文章主要介绍了Vue3组件通信具体用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • 如何在vue3中使用jsx语法

    如何在vue3中使用jsx语法

    这篇文章主要介绍了在vue3中使用jsx语法,下面主要通过对比jsx和template不同语法,来实现同样的功能,需要的朋友可以参考下
    2023-03-03
  • ElementUI日期选择器时间选择范围限制的实现

    ElementUI日期选择器时间选择范围限制的实现

    在日常开发中,我们会遇到一些情况,限制日期的范围的选择,本文就详细的介绍了ElementUI日期选择器时间选择范围限制的实现,文中通过示例代码介绍的非常详细,感兴趣的可以了解一下
    2022-04-04
  • 解决vue watch数据的方法被调用了两次的问题

    解决vue watch数据的方法被调用了两次的问题

    这篇文章主要介绍了解决vue watch数据的方法被调用了两次的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Vue3中v-model实现双向数据绑定的全面指南

    Vue3中v-model实现双向数据绑定的全面指南

    在Vue开发中,v-model是实现表单输入和应用状态之间双向绑定的关键指令,Vue 3对v-model进行了重大改进,使其更加灵活和强大,本文将深入探讨 Vue 3中v-model的工作原理、新特性以及最佳实践,需要的朋友可以参考下
    2025-07-07
  • Vue实现购物小球抛物线的方法实例

    Vue实现购物小球抛物线的方法实例

    这篇文章主要给大家介绍了Vue实现购物小球抛物线的方法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • lottie实现vue自定义loading指令及常用指令封装详解

    lottie实现vue自定义loading指令及常用指令封装详解

    这篇文章主要为大家介绍了lottie实现vue自定义loading指令及常用指令封装,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 浅谈element关于table拖拽排序问题

    浅谈element关于table拖拽排序问题

    本文主要介绍了element关于table拖拽排序问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论