当前位置:首页 > VUE

vue递归实现多级菜单

2026-02-22 00:48:19VUE

递归实现多级菜单的核心思路

Vue中递归组件通过组件自身调用自身实现嵌套结构,适合处理不确定层级的数据(如多级菜单)。关键在于组件名称的注册和递归终止条件。

基础组件结构

  1. 定义递归组件
    组件需设置name属性,模板内通过name直接引用自身:

    <template>
      <ul>
        <li v-for="item in menuData" :key="item.id">
          {{ item.title }}
          <Menu v-if="item.children" :menu-data="item.children"/>
        </li>
      </ul>
    </template>
    
    <script>
    export default {
      name: 'Menu', // 必须声明name
      props: ['menuData']
    }
    </script>
  2. 数据格式示例
    菜单数据通常为嵌套结构:

    const menuData = [
      {
        id: 1,
        title: '一级菜单',
        children: [
          { id: 11, title: '二级菜单' }
        ]
      }
    ]

动态组件方案(避免死循环)

通过v-for和条件渲染控制递归深度:

   <template>
     <ul>
       <li v-for="item in menuData" :key="item.id">
         {{ item.title }}
         <template v-if="item.children?.length">
           <Menu :menu-data="item.children"/>
         </template>
       </li>
     </ul>
   </template>

性能优化建议

  1. 添加终止条件
    通过max-depth属性限制递归层级:

    <Menu :menu-data="data" :max-depth="5"/>
  2. 使用v-memo缓存
    Vue 3中可对静态部分进行优化:

    <li v-for="item in menuData" :key="item.id" v-memo="[item.id]">

完整示例代码

<template>
  <ul class="menu">
    <li v-for="item in menuData" :key="item.id">
      <div @click="toggle(item)">
        {{ item.title }}
        <span v-if="hasChildren(item)">▶</span>
      </div>
      <Menu 
        v-if="item.children && item.expanded" 
        :menu-data="item.children"
        :max-depth="maxDepth - 1"
      />
    </li>
  </ul>
</template>

<script>
export default {
  name: 'Menu',
  props: {
    menuData: Array,
    maxDepth: { type: Number, default: 10 }
  },
  methods: {
    hasChildren(item) {
      return item.children?.length > 0
    },
    toggle(item) {
      if (this.hasChildren(item)) {
        item.expanded = !item.expanded
      }
    }
  }
}
</script>

样式处理技巧

使用CSS控制缩进和动画效果:

vue递归实现多级菜单

.menu ul {
  padding-left: 20px;
  transition: all 0.3s;
}
.menu li {
  list-style: none;
  cursor: pointer;
}

注意事项

  • 避免循环引用导致栈溢出,确保数据没有环形引用
  • 大数据量时考虑虚拟滚动(如使用vue-virtual-scroller
  • 通过Vue DevTools检查组件层级是否合理

标签: 递归菜单
分享给朋友:

相关文章

vue实现扇形菜单

vue实现扇形菜单

实现扇形菜单的思路 扇形菜单通常以圆形或扇形布局展示多个菜单项,可以通过CSS和Vue的动态渲染实现。关键在于计算每个菜单项的位置角度,并使用CSS的transform属性进行旋转定位。 基础HTM…

vue实现多级菜单

vue实现多级菜单

Vue 实现多级菜单的方法 递归组件实现 递归组件是处理多级菜单的常见方式,通过组件调用自身实现无限层级嵌套。 <template> <ul> <li v-…

vue实现设置菜单

vue实现设置菜单

Vue 实现设置菜单的方法 在 Vue 中实现设置菜单可以通过多种方式完成,以下是一些常见的方法: 使用组件化结构 创建独立的设置菜单组件,便于复用和维护。组件可以包含菜单项、图标和交互逻辑。 &…

vue v -for实现递归

vue v -for实现递归

Vue 中使用 v-for 实现递归 在 Vue 中,可以通过组件递归调用的方式结合 v-for 实现递归渲染树形结构或嵌套数据。 递归组件的基本实现 定义一个组件,并在组件内部调用自身,配合 v-…

vue实现侧边栏菜单

vue实现侧边栏菜单

实现侧边栏菜单的基本结构 使用Vue的模板语法构建侧边栏的基础HTML结构,通常包含一个<div>容器和嵌套的<ul>列表。菜单项通过v-for动态渲染,数据驱动视图。 &l…

vue实现菜单的全选

vue实现菜单的全选

实现全选功能的基本思路 在Vue中实现菜单全选功能通常需要结合v-model和计算属性来管理选中状态。核心逻辑是维护一个数组存储已选项,通过全选按钮切换所有选项的选中状态。 数据准备 定义菜单数据列…