当前位置:首页 > VUE

vue 实现动态菜单

2026-03-10 12:58:52VUE

实现动态菜单的方法

动态菜单通常指根据用户权限或后端配置动态生成的导航菜单。以下是基于 Vue 的实现方案:

数据结构设计

菜单数据通常从后端接口获取,建议采用嵌套结构。例如:

[
  {
    "name": "Dashboard",
    "path": "/dashboard",
    "icon": "el-icon-menu",
    "children": []
  },
  {
    "name": "User Management",
    "path": "/user",
    "icon": "el-icon-user",
    "children": [
      {
        "name": "List",
        "path": "/user/list"
      }
    ]
  }
]

路由配置

将菜单数据与路由配置关联:

vue 实现动态菜单

// router.js
const routes = [
  {
    path: '/dashboard',
    component: () => import('./views/Dashboard.vue'),
    meta: { title: 'Dashboard' }
  }
]

菜单组件实现

创建可递归渲染的菜单组件:

<template>
  <el-menu :default-active="activeMenu" router>
    <menu-item v-for="item in menuData" :key="item.path" :item="item"/>
  </el-menu>
</template>

<script>
import MenuItem from './MenuItem.vue'

export default {
  components: { MenuItem },
  props: ['menuData'],
  computed: {
    activeMenu() {
      return this.$route.path
    }
  }
}
</script>

递归子组件

处理多级菜单的递归渲染:

vue 实现动态菜单

<template>
  <el-submenu v-if="item.children.length" :index="item.path">
    <template #title>
      <i :class="item.icon"></i>
      <span>{{ item.name }}</span>
    </template>
    <menu-item 
      v-for="child in item.children" 
      :key="child.path" 
      :item="child"
    />
  </el-submenu>

  <el-menu-item v-else :index="item.path">
    <i :class="item.icon"></i>
    <span>{{ item.name }}</span>
  </el-menu-item>
</template>

<script>
export default {
  name: 'MenuItem',
  props: ['item']
}
</script>

权限控制

在导航守卫中实现权限验证:

// permission.js
router.beforeEach(async (to, from, next) => {
  const hasAccess = await checkPermission(to.meta.roles)
  if (!hasAccess) next('/403')
  else next()
})

数据获取

在应用初始化时获取菜单数据:

// App.vue
created() {
  this.$store.dispatch('user/fetchMenuData').then(menuData => {
    this.menuData = processMenuData(menuData)
  })
}

优化建议

  • 添加菜单缓存机制避免重复请求
  • 实现菜单排序功能
  • 添加菜单状态持久化(如 localStorage)
  • 考虑使用 Vuex 集中管理菜单状态
  • 对图标字段做兼容处理(支持 iconfont/svg/component)

标签: 菜单动态
分享给朋友:

相关文章

css制作菜单

css制作菜单

CSS 制作菜单的方法 使用 CSS 可以制作多种风格的菜单,包括水平菜单、垂直菜单、下拉菜单等。以下是几种常见的实现方式。 水平菜单 水平菜单通常用于导航栏,可以通过 display: inlin…

css制作横向菜单

css制作横向菜单

使用 Flexbox 制作横向菜单 Flexbox 是制作横向菜单的现代方法,代码简洁且兼容性好。以下是一个基本实现: <nav class="horizontal-menu"> &…

vue实现菜单搜索

vue实现菜单搜索

实现思路 在Vue中实现菜单搜索功能,通常需要结合输入框的实时监听、菜单数据的过滤以及结果的动态展示。核心逻辑包括监听用户输入、过滤菜单数据、高亮匹配关键词。 基本实现步骤 创建搜索输入框 在模板中…

vue实现左侧菜单

vue实现左侧菜单

实现左侧菜单的基本结构 在Vue中实现左侧菜单通常需要结合组件化思想和路由功能。使用<el-menu>组件(Element UI)或自定义组件搭配Vue Router是常见方案。 <…

uniapp 长按菜单

uniapp 长按菜单

实现长按菜单的方法 在UniApp中实现长按菜单功能,可以通过以下几种方式完成,具体取决于平台和需求。 使用@longpress事件绑定 在模板中为元素添加@longpress事件监听,触发后显示自…

vue实现悬浮菜单

vue实现悬浮菜单

实现悬浮菜单的基本思路 使用Vue实现悬浮菜单通常需要结合CSS定位和Vue的事件监听。核心是通过v-show或v-if控制菜单显隐,通过鼠标事件触发状态变化。 HTML结构示例 <templ…