千家信息网

Vue.js中如何利用递归组件实现一个可折叠的树形菜单

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"Vue.js中如何利用递归组件实现一个可折叠的树形菜单"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Vue.js中如何利用递归组件实现一个可
千家信息网最后更新 2026年11月01日Vue.js中如何利用递归组件实现一个可折叠的树形菜单

这篇文章主要介绍"Vue.js中如何利用递归组件实现一个可折叠的树形菜单"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Vue.js中如何利用递归组件实现一个可折叠的树形菜单"文章能帮助大家解决问题。

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

Vue.component('recursive-component', {  template: `       ` });

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

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

数据结构

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

一个 label 属性。

如果它有子节点,一个 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,内容如下:

 

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

基本事件

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

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

使用用法

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

import TreeMenu from './TreeMenu.vue' let tree = {  ... } new Vue({  el: '#app',  data: {   tree  },  components: {   TreeMenu  } })

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

下面是它目前的样子:

正确的姿势

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

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

 

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

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

展开/收起

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

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

 

关于"Vue.js中如何利用递归组件实现一个可折叠的树形菜单"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

组件 递归 节点 结构 属性 数据 数据结构 菜单 树形 文件 事件 内容 模板 知识 不同 数组 方法 标签 用户 类型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 广东万易互联网科技有限公司惠州分公司 互联网 卓越科技 为想互联网科技 富国互联网科技创新基金 安控科技rtu产品工业互联网 中国科技互联网公司收入 北京华百购互联网科技有限公司 荆州市昕露互联网络科技有限公司 崇明区互联网教育科技诚信经营 智腾互联网科技有限公司 互联网与医疗科技 畅思互联网科技 深圳艾果互联网通讯科技 威龙国际互联网科技公司 沐思想互联网科技有限公司 云南互联网科技学费 互联网领先科技活动 河南商务圈互联网科技有限公司 安徽九吞吴互联网科技有限公司 远拓互联网科技 金融科技和互联网金融 衡水科技产业互联网平台 互联网科技与管理 恒生互联网科技业指数调整周期 雨阳互联网卡科技有限公司 互联网科技收购价值 长沙易易互联网科技有限公司 上海互联网科技园景观 承德科技产业互联网平台
0