当前位置:首页 > VUE

vue动态菜单实现

2026-02-19 04:00:07VUE

Vue 动态菜单实现

数据驱动菜单结构

动态菜单的核心是通过数据驱动渲染。通常从后端接口获取菜单数据,存储为数组或树形结构。例如:

// 示例菜单数据结构
const menuData = [
  {
    id: 1,
    name: "首页",
    path: "/home",
    icon: "el-icon-house",
    children: []
  },
  {
    id: 2,
    name: "系统管理",
    path: "/system",
    icon: "el-icon-setting",
    children: [
      { id: 21, name: "用户管理", path: "/system/user" }
    ]
  }
]

递归组件实现多级菜单

使用递归组件处理无限层级菜单。创建 MenuItem.vue 组件:

<template>
  <el-submenu v-if="item.children" :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.id" 
      :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: Object
  }
}
</script>

路由权限控制

结合 Vue Router 实现动态路由添加。在路由守卫中处理权限:

// router/index.js
router.beforeEach(async (to, from, next) => {
  const hasMenu = store.getters.menuList.length > 0
  if (!hasMenu) {
    const menuData = await store.dispatch('getMenuData')
    const routes = generateRoutes(menuData)
    router.addRoutes(routes)
  }
  next()
})

// 动态路由生成函数
function generateRoutes(menuData) {
  return menuData.map(item => ({
    path: item.path,
    component: () => import(`@/views${item.path}.vue`),
    children: item.children ? generateRoutes(item.children) : []
  }))
}

状态管理集成

使用 Vuex 集中管理菜单状态:

// store/modules/menu.js
export default {
  state: {
    menuList: []
  },
  mutations: {
    SET_MENU(state, payload) {
      state.menuList = payload
    }
  },
  actions: {
    async getMenuData({ commit }) {
      const res = await api.getMenu()
      commit('SET_MENU', res.data)
      return res.data
    }
  }
}

响应式菜单激活

处理菜单激活状态与路由同步:

<!-- MainLayout.vue -->
<el-menu 
  :default-active="$route.path"
  :router="true"
  @select="handleSelect"
>
  <menu-item 
    v-for="item in menuList" 
    :key="item.id" 
    :item="item"
  />
</el-menu>

菜单权限过滤

根据用户角色过滤可见菜单项:

// utils/auth.js
export function filterMenu(menuData, roles) {
  return menuData.filter(item => {
    if (item.meta?.roles) {
      return item.meta.roles.some(role => roles.includes(role))
    }
    return true
  }).map(item => {
    if (item.children) {
      item.children = filterMenu(item.children, roles)
    }
    return item
  })
}

性能优化建议

对于大型菜单系统,可采用以下优化方案:

  • 菜单数据懒加载:只在展开父菜单时加载子项
  • 使用 keep-alive 缓存高频访问的菜单组件
  • 对菜单数据进行扁平化处理,减少递归深度

典型问题解决方案

处理菜单图标动态加载:

// 创建图标映射
const iconMap = {
  'home': 'el-icon-house',
  'user': 'el-icon-user'
}

// 在组件中使用
<i :class="iconMap[item.iconKey]"></i>

处理外链菜单项:

vue动态菜单实现

<el-menu-item 
  v-if="item.isExternal"
  @click="window.open(item.path)"
>
  外链菜单
</el-menu-item>

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

相关文章

css div 制作导航菜单

css div 制作导航菜单

基本导航菜单结构 使用HTML创建一个简单的导航菜单结构,通常使用<ul>和li>列表实现。每个菜单项用<a>标签包裹以实现链接功能。 <div class="n…

vue实现微博发布动态

vue实现微博发布动态

Vue 实现微博发布动态功能 数据绑定与表单设计 使用 Vue 的 v-model 实现表单双向绑定,创建动态内容输入框和图片上传组件。示例代码: <template> <di…

css菜单制作

css菜单制作

CSS 菜单制作方法 水平导航菜单 使用 display: inline-block 或 flexbox 可以轻松创建水平导航菜单。以下是一个基本示例: <nav> <ul c…

vue动态表格实现

vue动态表格实现

Vue动态表格实现方法 使用v-for指令渲染动态数据 通过v-for指令可以循环遍历数组数据生成表格行,数据变化时表格自动更新。示例代码: <template> <table…

vue表格动态实现

vue表格动态实现

Vue 表格动态实现方法 动态表格的实现通常涉及数据绑定、列配置动态化以及交互功能的灵活处理。以下是几种常见场景的具体实现方式: 动态数据绑定 通过v-for指令循环渲染表格行数据,数据变化时表格自…

react如何实现菜单

react如何实现菜单

使用 React 实现菜单的方法 使用状态管理控制菜单显示/隐藏 通过 useState 管理菜单的展开和收起状态,结合点击事件切换状态。 import { useState } from 'rea…