当前位置:首页 > VUE

vue 实现多级菜单

2026-03-09 17:01:25VUE

Vue 实现多级菜单的方法

递归组件实现

递归组件是处理多级菜单的常见方式,通过组件调用自身实现无限层级嵌套。

<template>
  <ul>
    <li v-for="item in menuData" :key="item.id">
      {{ item.name }}
      <MultiLevelMenu 
        v-if="item.children && item.children.length" 
        :menuData="item.children"
      />
    </li>
  </ul>
</template>

<script>
export default {
  name: 'MultiLevelMenu',
  props: {
    menuData: {
      type: Array,
      required: true
    }
  }
}
</script>

动态组件实现

通过动态组件和路由配置实现多级菜单,适合与Vue Router结合使用。

<template>
  <div>
    <div v-for="item in menu" :key="item.path">
      <router-link v-if="!item.children" :to="item.path">
        {{ item.meta.title }}
      </router-link>
      <el-submenu v-else :index="item.path">
        <template #title>{{ item.meta.title }}</template>
        <menu-item :menu="item.children" />
      </el-submenu>
    </div>
  </div>
</template>

使用UI框架

Element UI或Ant Design Vue等框架提供了现成的多级菜单组件。

<template>
  <el-menu :default-active="activeIndex">
    <template v-for="item in menuData">
      <el-submenu 
        v-if="item.children" 
        :key="item.id" 
        :index="item.id.toString()"
      >
        <template #title>{{ item.name }}</template>
        <el-menu-item 
          v-for="child in item.children" 
          :key="child.id" 
          :index="child.id.toString()"
        >
          {{ child.name }}
        </el-menu-item>
      </el-submenu>
      <el-menu-item v-else :key="item.id" :index="item.id.toString()">
        {{ item.name }}
      </el-menu-item>
    </template>
  </el-menu>
</template>

状态管理

对于复杂的多级菜单,建议使用Vuex或Pinia管理菜单状态。

// store/modules/menu.js
export default {
  state: {
    menuTree: []
  },
  mutations: {
    setMenu(state, payload) {
      state.menuTree = payload
    }
  }
}

性能优化

大型多级菜单应考虑虚拟滚动或懒加载优化性能。

<template>
  <RecycleScroller
    :items="flattenMenu"
    :item-size="50"
    key-field="id"
  >
    <template #default="{ item }">
      <div :style="{ paddingLeft: `${item.level * 20}px` }">
        {{ item.name }}
      </div>
    </template>
  </RecycleScroller>
</template>

样式处理

多级菜单通常需要缩进样式表示层级关系。

.menu-item {
  padding-left: calc(var(--level) * 15px);
}

路由集成

与Vue Router集成时,可通过路由配置生成菜单。

vue 实现多级菜单

const routes = [
  {
    path: '/dashboard',
    component: Dashboard,
    meta: { title: 'Dashboard' },
    children: [
      {
        path: 'analytics',
        component: Analytics,
        meta: { title: 'Analytics' }
      }
    ]
  }
]

标签: 菜单vue
分享给朋友:

相关文章

vue状态管理怎么实现

vue状态管理怎么实现

Vue 状态管理实现方法 使用 Vuex(官方推荐) Vuex 是 Vue 的官方状态管理库,适合中大型应用。 安装 Vuex: npm install vuex --save 创建 Store 示…

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue实现复选

vue实现复选

Vue 实现复选框 在 Vue 中实现复选框可以通过 v-model 指令绑定数据,同时结合 input 元素的 type="checkbox" 属性来实现。以下是几种常见的实现方式: 单个复选框…

vue实现标题

vue实现标题

Vue 实现标题的方法 在Vue中实现标题可以通过多种方式,以下是几种常见的方法: 方法一:使用模板语法 在Vue组件的模板中直接使用HTML的<h1>到<h6>标签来定义…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…

vue实现发帖

vue实现发帖

使用 Vue 实现发帖功能 前端实现 创建发帖表单组件,包含标题和内容输入框,以及提交按钮。使用 v-model 绑定表单数据。 <template> <div>…