当前位置:首页 > 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等框架提供了现成的多级菜单组件。

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
    }
  }
}

性能优化

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

vue 实现多级菜单

<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集成时,可通过路由配置生成菜单。

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

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

相关文章

vue实现导航切换内容

vue实现导航切换内容

Vue实现导航切换内容的方法 在Vue中实现导航切换内容,可以通过以下方式实现: 使用动态组件 动态组件通过<component :is="currentComponent">实现内容切…

vue调用接口实现退出

vue调用接口实现退出

实现Vue退出功能的步骤 在Vue中调用接口实现退出功能通常需要与后端API交互,以下是实现方法: 前端实现 创建退出方法,调用后端API接口: methods: { logout()…

vue实现一个tab栏

vue实现一个tab栏

Vue 实现 Tab 栏 基础实现(选项式 API) <template> <div class="tab-container"> <div class="t…

vue实现drag

vue实现drag

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种常见方法的实现方式。 使用 HTML5 拖拽…

vue实现 toast

vue实现 toast

Vue 实现 Toast 组件 在 Vue 中实现 Toast 组件可以通过多种方式完成,以下是几种常见的方法: 使用全局组件和事件总线 创建一个全局的 Toast 组件,并通过事件总线或 Vue…

甘特图vue实现

甘特图vue实现

甘特图 Vue 实现方法 使用开源库 vue-ganttastic 安装依赖: npm install vue-ganttastic 基础实现代码: <template> <…