用Vue.js递归组件构建一个可折叠的树形菜单

最好用的 7 个 Vue Tree select 树形组件 - 卡拉云 Vue 树形选择器(Vue tree select)组件在搭建 Vue 的 app 中特别常用,Vue tree select 除了简单的树形结构外,还有非常多样的功能来配合不同场景的使用。比如搜索过滤,前端添加删除树枝,前端编辑修改子树名,拖拽排序,对用户操作事件记录等。本文记录了我自己使用多年最好用的 7 款 Vue tree select 组件,每一款都经过我实际测试,推荐给大家。 阅读详情

在Vue.js中一个递归组件调用的是其本身,如:

 Vue.component('recursive-component', {

   template: `<!--Invoking myself!-->

              <recursive-component></recursive-component>`

 });

递归组件常用于在blog上显示注释、嵌套的菜单,或者基本上是父和子相同的类型,尽管具体内容不同。例如:

现在给您演示一下如何有效地使用递归组件,我将通过建立一个可扩展/收缩的树形菜单的来一步步进行。

数据结构

一个树状UI的递归组件将是一些递归数据结构的可视化表达。在本教程中,我们将使用树状结构,其中每个节点都是一个对象:

  1. 一个 label 属性。

  2. 如果它有子节点,一个 nodes 属性,则它是一个或多个节点的数组属性。

与所有树结构一样,它必须有一个根节点,但可以无限深。

 let tree = {

   label: 'root',

   nodes: [

     {

       label: 'item1',

       nodes: [

         {

           label: 'item1.1'

         },

         {

           label: 'item1.2',

           nodes: [

             {

               label: 'item1.2.1'

             }

           ]

         }

       ]

     }, 

     {

       label: 'item2'  

     }

   ]

 }

递归组件

让我们做一个递归组件来显示我们的称为 TreeMenu 的数据结构。它只显示当前节点的标签,并调用自己来显示任何子节点。文件名:TreeMenu.vue,内容如下:

 <template>

   <div class="tree-menu">

     <div>{{ label }}</div>

     <tree-menu 

       v-for="node in nodes" 

       :nodes="node.nodes" 

       :label="node.label"

     >

     </tree-menu>

   </div>

 </template>

 <script>

   export default { 

     props: [ 'label', 'nodes' ],

     name: 'tree-menu'

   }

 </script>

如果你使用一个组件递归,必须先给 Vue.component 做一个全局的定义,或者,给它一个 name 属性。否则,任何子组件将无法进一步调用它,你会得到一个不确定的“undefined component error”的错误提示。

基本事件

与任何递归函数一样,你需要一个基本事件来结束递归,否则渲染将无限期地继续下去,最终会导致堆栈溢出。

在树菜单中,当我们到达一个没有子节点的节点的时候,我们希望停止递归。你能通过 v-if 做到这一功能,但我们选择使用 v-for 将隐式地为我们实现它;如果 nodes 数组没有任何进一步的定义 tree-menu 组件将被调用。template.vue文件如下:

<template>

   <div class="tree-menu">

     ...

     <!--If `nodes` is undefined this will not render-->

     <tree-menu v-for="node in nodes"></tree-menu>

 </template>

使用用法

我们现在如何使用这个组件?首先,我们声明一个Vue实例,具有一个数据结构包括data属性和定义过的treemenu组件。app.js文件如下:

 import TreeMenu from './TreeMenu.vue'

 let tree = {

   ...

 }

 new Vue({

   el: '#app',

   data: {

     tree

   },

   components: {

     TreeMenu

   }

 })

请记住,我们的数据结构有一个根节点。我们在主模板开始递归调用 TreeMenu 组件,使用根 nodes 属性来props:

 <div id="app">

   <tree-menu :label="tree.label" :nodes="tree.nodes"></tree-menu>

 </div>

下面是它目前的样子:

正确的姿势

在视觉上识别子组件的“深度”是很好的,这样用户就可以从UI中获得数据结构的感觉。让我们缩进每一层的子节点来实现这个目标。

这是通过增加一个depth prop定义,通过 TreeMenu 来实现。我们将使用这个值动态地将内联样式与转换绑定在一起:将使用transform: translate的CSS规则为每个节点的标签,从而创建缩进。template.vue修改如下:

 <template>

   <div class="tree-menu">

     <div :style="indent">{{ label }}</div>

     <tree-menu 

       v-for="node in nodes" 

       :nodes="node.nodes" 

       :label="node.label"

       :depth="depth + 1"

     >

     </tree-menu>

   </div>

 </template>

 <script>

   export default { 

     props: [ 'label', 'nodes', 'depth' ],

     name: 'tree-menu',

     computed: {

       indent() {

         return { transform: `translate(${this.depth * 50}px)` }

       }

     }

   }

 </script>

depth 属性在主模板中从零开始。在上面的组件模板中,你可以看到每次传递到任何子节点时这个值都会递增。

 <div id="app">

   <tree-menu 

     :label="tree.label" 

     :nodes="tree.nodes"

     :depth="0"

   ></tree-menu>

 </div>

注意:记得 v-bind depth值以确保它是一个JavaScript数字类型而不是字符串。

展开/收起

由于递归数据结构可能很大,所以显示它们的一个很好的UI技巧是隐藏除根节点以外的所有节点,以便用户可以根据需要展开或收起节点。

为此,我们将增加一个局部属性showChildren 。如果他的值为False,子节点将不会被渲染。此值应通过点击节点切换,所以我们需要使用一个单击事件的监听器方法 toggleChildren 来进行管理。template.vue文件修改如下:

<template>

   <div class="tree-menu">

     <div :style="indent" @click="toggleChildren">{{ label }}</div>

     <tree-menu 

       v-if="showChildren"

       v-for="node in nodes" 

       :nodes="node.nodes" 

       :label="node.label"

       :depth="depth + 1"

     >

     </tree-menu>

   </div>

 </template>

 <script>

   export default { 

     props: [ 'label', 'nodes', 'depth' ],

     data() {

       return { showChildren: false }

     },

     name: 'tree-menu',

     computed: {

       indent() {

         return { transform: `translate(${this.depth * 50}px)` }

       }

     },

     methods: {

       toggleChildren() {

         this.showChildren = !this.showChildren;

       }

     }

   }

 </script

总结

这样,我们就有了一个工作树菜单。用来画龙点睛的一个方法是,你可以添加一个加号/减号图标,这样可以使UI的显示更加明显。我还增加了的很好的字体和计算性能在原来 showChildren 的基础上。

去CodePen(https://codepen.io/anthonygore/pen/PJKNqa)可以看看我是如何实现它的。

50a40001b9f98a9a2810

来自汇智网(www.hubwiz.com,有很多性价比极高的vue.js内容哦)的小智翻译。

分享Vue.js 2 的最新全家桶系列教程:

1.vue.js 入门与提高: http://xc.hubwiz.com/course/vue.js
2.vuex 2 入门与提高: http://xc.hubwiz.com/course/vuex
3.vue-router 入门与提高: http://xc.hubwiz.com/course/vuerouter
4.vue.js 工程化实践: http://xc.hubwiz.com/course/vuegch

vue+elementUI组件递归实现可折叠动态渲染多级侧边栏导航 早就实现了功能,但是发现点击的时候,选中的菜单项背景色会变白,周五时候仔细观察了一下,发现并不是调整样式的问题,而是选项没有被选中,于是好好研究了一下组件递归这块,总结记录一下心路历程 一、概念 递归:递归其实说白了,就是自己调用自己,样子就像是套娃一个套一个的,小时候玩过一个游戏汉诺塔就是利用的递归原理: 函数递归:函数利用函数名还调用自己 组件递归:所以组件递归利用的是vue组件中的name属性来实现的 二、需求 实现可折叠动态渲染多级侧边栏导航 三、分析 1、观察到侧边栏导航是一级一级的,第二. 阅读详情

相关推荐

用d3+vue实现一个可折叠的树状图

用d3+vue实现一个可折叠的树状图 背景 前两天接到了一个需求,监控系统要实现一个可以折叠展开的树状图来展示完整的接口调用链,同时右侧要展示一些接口的相关信息诸如耗时、调用时间、返回值之类的。 Demo 先在网上找了个demo,完美符合了需求。 Demo地址:点击跳转demo 效果预览 接下来就是在demo的基础上加一些自定义的东西丰富下树状图,先给大家看一下效果: 展开状态: 折叠状态: 代码 设计思路很简单,先把demo封装成一个方法,返回值就是html代码,直接在父组件里通过操作dom替换成新

PushYE的博客 1844

vue树结构横向纵向组合展示效果实现

横向树结构。

weixin_50238536的博客 1386

uni-app树组件开发指南:从递归渲染到跨端适配

树形结构是计算机科学中用于表示层级关系的基础数据结构,广泛应用于文件系统、组织架构、分类目录等场景。其核心原理是通过节点与子节点的递归引用,形成一种高效的数据组织方式。在前端开发领域,树形数据的可视化展示具有极高的技术价值,它直接关系到后台管理系统、资源管理器等复杂界面的用户体验。实现一个功能完备的树组件,需要综合运用组件化、递归渲染和状态管理等核心技术。在uni-app这样的跨端框架中,开发树组件还需特别考虑数据结构的通用性设计、复选框的联动算法(包括全选、半选状态的计算),以及不同平台(H5、小程序、A

weixin_30977485的博客 316

html可折叠tree,用 Vue.js 递归组件实现可折叠的树形菜单(demo)_奔赴_前端开发者

在递归组件常用于在blog上显示注释、嵌套的菜单,或者基本上是父和子相同的类型,尽管具体内容不同。例如:现在给您演示一下如何有效地使用递归组件,我将通过建立一个可扩展/收缩的树形菜单的来一步步进行。数据结构一个树状UI的递归组件将是一些递归数据结构的可视化表达。在本教程中,我们将使用树状结构,其中每个节点都是一个对象:一个 label 属性。如果它有子节点,一个 nodes 属性,则它是一个或多个...

weixin_29091837的博客 643

关于ElementUI之动态树+数据表格+分页实例

并且在自己为菜单创建的接口里进行编写方法之后,再到实现类里面进行重新。配置文件中编写动态SQL。数据表的创建及数据添加。

m0_74915426的博客 1900

利用Python实现纬度加权平均(即NCL中的wgt_areaave)

当处理全球数据的时候,最常见的分析就是全球、北半球平均了,这时候一定要注意要根据纬度等信息进行加权,求加权平均,要不然结果肯定会不准。但是对于Python中,常规的计算包里面是没有的,或许现在有其他包可以实现,也可以告诉我~。

记录基于python语言处理气象问题的一些代码,包括不限于气象数据读取、机器学习和深度学习建模。 5743

什么是递归?递归组件实现可折叠的树形菜单??

递归 递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。 所以递归要有两个要素,结束条件与递推关系。 递归有两个基本要素: (1)边界条件:确定递归到何时终止,也称为递归出口。 (2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果 。 可折叠的树形菜单 类似于: 代码: 父组件中的: <templa..

lqlq54321的博客 589

保姆级教程:手把手教你从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件(附网址规律总结)

本文提供从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件的详细教程,包括路径解析、版本号确定和下载命令示例。特别解析了GRCh37的特殊存储结构,并分享批量下载、文件校验等高级技巧,帮助生物信息学研究者高效获取基因组注释文件。

weixin_29289821的博客 204

php树状形可以折叠,在Vue.js中如何实现可折叠的树形菜单

通过本文给您演示一下如何有效地使用递归组件,我将通过建立一个可扩展/收缩的树形菜单的来一步步进行。下面通过本文给大家分享用 Vue.js 递归组件实现可折叠的树形菜单,需要的朋友参考下吧在Vue.js中一个递归组件调用的是其本身,如:Vue.component('recursive-component', {template: ``});递归组件常用于在blog上显示注释、嵌套的菜单,或者基本上是...

weixin_42523389的博客 307

ADS谐波平衡仿真自动优化报错?三步搞定HB控件设置(附常见错误排查)

本文针对ADS谐波平衡仿真在自动优化中常见的报错问题,提供了三步核心排查法。首先检查并禁用HB控件中可能导致冲突的小信号仿真模式,其次合理化仿真频率与扫描参数设置,最后审视优化变量与目标的定义。通过精准配置HB控件以适配自动优化流程,能有效解决大多数仿真失败问题,确保非线性电路设计顺利进行。

c2d3e4f的博客 786

RTKLIB使用方法(喂饭版)(三)——RTKPOST

应用OTL校正需要在“files”的“ocean loading BLQ format”中配置OTL文件。应用极潮需要在“files”的“EOP data file”配置ERP(地球旋转参数)文件。RAIM FDE:设置是否启用RAIM(接收机自主完整性监控)FDE(故障检测和排除)功能。点击下方的“save”可以把配置保存成文件,点击“load”就可以把配置文件加载出来。4接收机动态模型/地球潮汐矫正:设置流动站接收机动力学模型,只可以使用在DGPS/DGNSS或动态模型中。选择流动站天线的类型。

A2020713的博客 1万+

vue树形权限菜单_详解Vue.js iview实现树形权限表(可扩展表)

问题:需要一个可折叠的权限管理系统,用表格展示。主要用的iView组件库,有Table(表格),Tree(树形控件),Collapse(折叠面板)看起来比较符合意思深入查看Table相关范例,发现有个通过给columns数据设置一项,指定type: 'expand',即可开启扩展功能 可以考虑但也只是展开详细内容,如需树形结构,则需要render自定义去渲染,挺麻烦的。再去看看eleme...

weixin_39998273的博客 809

代码复现3—VLN-CE

运行训练完后在 data文件下会自动生成一个“checkpoints”文件,文件下包含任务文件“seq2seq”,该文件下会包括训练出来的权重和评估结果。数据集下载完后路径提取:data/scene_datasets/mp3d/{scene}/{scene}.glb。注意这里下载的数据集并不是所有的matterport3d,只需要一部分,包含90个场景,大小压缩后约16G。在“eval”时,会在data文件下生成videos文件,里面存放的是可视化的轨迹视频。

qq_44100524的博客 3198

Vue3+ElementUI树形菜单:构建层次化用户界面

本文深入探讨了树形菜单的设计原理与实现方法。树形菜单是一种层次化展示数据的UI组件,具有展开/折叠、多选、搜索过滤等核心功能。文章详细介绍了树形菜单的数据结构、转换算法,并以Vue项目为例演示了使用ElementPlus实现树形菜单的过程,包括基础功能、级联选择和自定义节点内容等高级特性。重点分析了树形菜单在权限管理系统中的实际应用,提供了全选、反选等操作的具体实现代码。最后讨论了树形菜单在组织架构、文件管理等场景的应用价值,并给出了大数据量下的性能优化建议。

yydsdaydayup的博客 1604

【虚幻引擎UE】UE5 可编辑动态样条线轨迹及AI跟随路径移动(含工程源码)

【虚幻引擎UE】可编辑动态样条线轨迹及AI跟随路径移动

灵境引路人 6226

深入浅出SCSI子系统(一)Linux 内核中的 SCSI 架构

scsi系统

sinat_37817094的博客 6488

Vue学习笔记-多级菜单 + 图标(递归渲染、自动展开、收缩模式)

本文详细记录了使用Vue3和Element Plus实现后台管理系统多级菜单的全过程。主要内容包括:1)引入Element Plus组件库和图标库;2)设计树形菜单结构,支持无限嵌套;3)通过递归渲染实现多级菜单展示;4)使用el-menu组件优化菜单交互,实现自动展开父级菜单;5)为菜单项添加动态图标映射功能;6)采用现代化UI设计风格美化侧边栏。该方案不仅实现了基础功能,还通过Pinia状态管理、路由配置优化等方式提升了系统的可扩展性,为后续接入真实API和权限系统奠定了基础。

weixin_68913425的博客 1075

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

基于vue的树形控件,回调组件

free-tree-list.vue&lt;template&gt; &lt;li&gt; &lt;span @click="toggle(model.id)"&gt; &lt;i v-if="isFolder" class="icon" :class="[open ? 'folder-open': 'folder']"&gt;&am

ChasenZh的博客 2971

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

TinyVue TreeMenu 树形菜单完全指南

介绍 OpenTiny TinyVue TreeMenu 树形菜单组件,涵盖快速上手、服务端数据、节点高亮、搜索过滤、多选、懒加载、拖拽及插槽自定义,适合后台侧边栏导航场景。

m0_70721415的博客 238

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

oracle堆栈溢出,js 函数堆栈溢出

js堆栈溢出错误function prompt() {var answer = prompt("What is your name","")if (answer) {alert("Hello, " + answer + "!")...文章技术mix呢2017-11-16761浏览量scriptaculous1.7.0和Prototype1.5.1不兼容引起的问题Scriptaculous1.7.0...

weixin_29328371的博客 210
上一篇: 2018年最应该关注的11个vue.js组件库
下一篇: 如何用Vue-cli在Vue.js项目中启动TDD(测试驱动开发)
落叶无声9
博客等级 码龄12年 443粉丝 343原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值