当前位置:首页 > VUE

vue 实现动态菜单

2026-01-18 07:05:30VUE

动态菜单的实现思路

在Vue中实现动态菜单通常涉及从后端API获取菜单数据,根据用户权限或角色动态渲染菜单项。核心思路是将菜单数据与组件分离,通过数据驱动视图。

数据准备与API交互

创建菜单数据模型,通常包含菜单名称、路径、图标、子菜单等字段。通过axios或其他HTTP库从后端获取菜单数据:

// 示例菜单数据结构
[
  {
    name: 'Dashboard',
    path: '/dashboard',
    icon: 'el-icon-menu',
    children: []
  },
  {
    name: '用户管理',
    path: '/user',
    icon: 'el-icon-user',
    children: [
      { name: '用户列表', path: '/user/list' }
    ]
  }
]

在Vuex或Pinia中存储菜单状态,创建action异步获取菜单数据:

// Vuex示例
actions: {
  async fetchMenus({ commit }) {
    const { data } = await axios.get('/api/menus')
    commit('SET_MENUS', data)
  }
}

递归组件实现多级菜单

创建可递归的菜单组件处理多级嵌套菜单结构:

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

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

<script>
export default {
  name: 'MenuItem',
  props: {
    menuData: Array
  }
}
</script>

路由权限控制

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

router.beforeEach(async (to, from, next) => {
  const hasMenus = store.getters.menus.length > 0
  if (!hasMenus) {
    await store.dispatch('fetchMenus')
    const menus = store.getters.menus
    const routes = generateRoutes(menus)
    router.addRoutes(routes)
    return next(to.path)
  }
  next()
})

function generateRoutes(menus) {
  return menus.map(menu => ({
    path: menu.path,
    component: () => import(`@/views${menu.path}/index.vue`),
    children: menu.children ? generateRoutes(menu.children) : []
  }))
}

响应式菜单状态管理

使用计算属性实现菜单的响应式更新,结合权限过滤可见菜单项:

computed: {
  filteredMenus() {
    const { menus, permissions } = this.$store.state
    return filterMenusByPermission(menus, permissions)
  }
}

function filterMenusByPermission(menus, permissions) {
  return menus.filter(menu => {
    if (menu.permission && !permissions.includes(menu.permission)) {
      return false
    }
    if (menu.children) {
      menu.children = filterMenusByPermission(menu.children, permissions)
    }
    return true
  })
}

菜单激活状态保持

利用Vue Router的matched属性实现菜单高亮同步:

watch: {
  '$route.matched'(matched) {
    this.activeMenu = matched[matched.length - 1]?.path
  }
}

性能优化建议

对于大型菜单系统,可以采用虚拟滚动优化长列表性能。实现菜单数据的懒加载,只在展开父菜单时加载子菜单数据。使用keep-alive缓存常用菜单对应的组件状态。

vue 实现动态菜单

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

相关文章

vue实现左右菜单联动实现

vue实现左右菜单联动实现

Vue 实现左右菜单联动 使用事件总线通信 在 Vue 中可以通过事件总线实现左右菜单的通信。创建一个中央事件总线实例,让左右菜单通过事件监听和触发实现联动。 // eventBus.js impo…

vue菜单tab实现

vue菜单tab实现

实现Vue菜单Tab的步骤 在Vue中实现菜单Tab功能,可以通过动态组件或条件渲染来实现。以下是几种常见的方法: 使用动态组件 动态组件允许根据当前选中的Tab动态切换显示内容。定义一个组件数组…

css制作菜单

css制作菜单

水平菜单制作 使用display: inline-block或flexbox布局创建水平菜单。设置list-style: none移除默认列表样式,添加padding和margin调整间距。 &l…

vue elementui实现菜单

vue elementui实现菜单

Vue ElementUI 实现菜单 安装 ElementUI 确保项目已安装 Vue 和 ElementUI。若未安装,可以通过以下命令安装: npm install element-ui 在…

css div 制作导航菜单

css div 制作导航菜单

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

css二级菜单制作

css二级菜单制作

使用纯CSS实现二级菜单 通过嵌套HTML结构和CSS选择器实现二级菜单的显示与隐藏效果。以下是一个基础实现方案: HTML结构: <ul class="menu"> <…