当前位置:首页 > 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的动态组件主要通过<component>标签和is属性实现,其核心原理涉及以下机制: 动态组件基础语法 <component :is="curre…

vue 菜单实现

vue 菜单实现

Vue 菜单实现方法 基于路由的动态菜单 在 Vue 项目中,可以利用 Vue Router 实现动态菜单。首先定义路由配置,包含菜单所需的元信息(如标题、图标等)。 const routes =…

css制作下拉菜单

css制作下拉菜单

使用纯CSS制作下拉菜单 通过HTML和CSS可以创建无需JavaScript的下拉菜单,主要利用:hover伪类和display属性控制显示隐藏。 HTML结构示例: <div class…

elementui动态

elementui动态

ElementUI 动态组件与数据绑定 ElementUI 支持动态渲染组件和数据绑定,常用于表格、表单等场景的动态生成。通过 v-for 和动态属性绑定实现组件灵活配置。 动态生成表格列 <…

vue动态表格实现

vue动态表格实现

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

vue实现菜单搜索

vue实现菜单搜索

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