当前位置:首页 > VUE

vue实现的菜单管理

2026-01-23 03:47:23VUE

Vue 实现菜单管理方案

基于 Vue Router 的动态路由

动态路由结合后端接口实现菜单权限控制。通过接口获取用户权限菜单列表,格式化后动态添加到路由配置中。

// 动态路由示例代码
const router = new VueRouter({
  routes: [] // 初始为空
})

// 获取菜单数据后处理
api.getMenus().then(menus => {
  const dynamicRoutes = formatRoutes(menus)
  router.addRoutes(dynamicRoutes)
})

function formatRoutes(menus) {
  return menus.map(menu => ({
    path: menu.path,
    component: () => import(`@/views/${menu.component}.vue`),
    meta: { title: menu.title }
  }))
}

递归组件实现多级菜单

使用 Vue 的递归组件特性处理无限层级菜单结构,适合企业级后台系统的复杂菜单需求。

<!-- 递归菜单组件示例 -->
<template>
  <el-submenu v-if="hasChildren" :index="menu.id">
    <template #title>{{ menu.title }}</template>
    <menu-item 
      v-for="child in menu.children"
      :key="child.id"
      :menu="child"
    />
  </el-submenu>
  <el-menu-item v-else :index="menu.id">
    {{ menu.title }}
  </el-menu-item>
</template>

<script>
export default {
  name: 'MenuItem',
  props: {
    menu: Object
  },
  computed: {
    hasChildren() {
      return this.menu.children && this.menu.children.length
    }
  }
}
</script>

状态管理集成

将菜单状态纳入 Vuex 统一管理,便于跨组件访问和状态持久化。

// store/modules/menu.js
export default {
  state: {
    menus: [],
    activeMenu: ''
  },
  mutations: {
    SET_MENUS(state, menus) {
      state.menus = menus
    },
    SET_ACTIVE_MENU(state, path) {
      state.activeMenu = path
    }
  },
  actions: {
    async fetchMenus({ commit }) {
      const menus = await api.getMenus()
      commit('SET_MENUS', menus)
    }
  }
}

菜单数据格式示例

推荐采用标准化数据结构,便于前端处理和渲染。

{
  "id": "1",
  "title": "系统管理",
  "icon": "el-icon-setting",
  "path": "/system",
  "component": "Layout",
  "children": [
    {
      "id": "1-1",
      "title": "用户管理",
      "path": "/system/user",
      "component": "User"
    }
  ]
}

权限控制实现

结合路由守卫实现菜单访问权限控制,未授权菜单自动隐藏或拦截访问。

// 路由守卫示例
router.beforeEach((to, from, next) => {
  const hasPermission = store.getters.menus.some(
    menu => menu.path === to.path
  )

  if (!hasPermission && to.path !== '/login') {
    next('/403')
  } else {
    next()
  }
})

响应式菜单优化

针对移动端添加菜单折叠功能,使用 CSS 媒体查询实现响应式布局。

<template>
  <el-menu 
    :collapse="isCollapse"
    @select="handleSelect"
  >
    <!-- 菜单内容 -->
  </el-menu>
</template>

<script>
export default {
  data() {
    return {
      isCollapse: false
    }
  },
  methods: {
    handleCollapse() {
      this.isCollapse = !this.isCollapse
    }
  }
}
</script>

<style>
@media (max-width: 768px) {
  .el-menu {
    width: 64px;
  }
}
</style>

面包屑导航集成

根据当前路由自动生成面包屑导航,提升用户体验。

computed: {
  breadcrumbs() {
    const matched = this.$route.matched
    return matched.map(route => ({
      title: route.meta.title,
      path: route.path
    }))
  }
}

菜单图标方案

支持多种图标引入方式,推荐使用 SVG 图标保证清晰度。

<template>
  <el-menu-item>
    <svg-icon v-if="menu.icon" :icon-class="menu.icon" />
    <span slot="title">{{ menu.title }}</span>
  </el-menu-item>
</template>

性能优化建议

对于大型菜单系统,采用虚拟滚动技术优化渲染性能。

<template>
  <virtual-list 
    :size="48"
    :remain="10"
    :data="menus"
  >
    <menu-item 
      v-for="menu in menus"
      :key="menu.id"
      :menu="menu"
    />
  </virtual-list>
</template>

vue实现的菜单管理

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

相关文章

vue如何实现放大缩小

vue如何实现放大缩小

Vue实现放大缩小功能的方法 在Vue中实现元素的放大缩小功能,可以通过CSS变换、第三方库或直接操作DOM样式来实现。以下是几种常见的方法: 使用CSS transform属性 通过绑定Vue的…

vue实现文字播放栏

vue实现文字播放栏

Vue 实现文字播放栏(跑马灯效果) 方法一:使用 CSS 动画 + Vue 数据绑定 通过 CSS 的 @keyframes 实现动画效果,结合 Vue 的动态数据绑定控制内容。 <t…

vue如何实现到期提醒

vue如何实现到期提醒

实现 Vue 到期提醒功能 使用计算属性计算剩余时间 在 Vue 组件中定义一个计算属性,计算目标日期与当前日期的差值。通过 Date 对象获取时间戳并计算剩余天数或小时数。 computed: {…

vue 移动端实现签名

vue 移动端实现签名

Vue 移动端签名实现方法 在移动端实现签名功能,可以通过HTML5的Canvas结合触摸事件完成。以下是具体实现步骤: 使用Canvas绘制签名 安装vue-signature-pad插件或直接使…

vue实现滚动截屏

vue实现滚动截屏

实现滚动截屏的基本思路 滚动截屏通常指对超出可视区域的长页面进行完整截图。在Vue中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现 安装…

vue设计与实现目录

vue设计与实现目录

以下是《Vue设计与实现》一书的典型目录结构(根据常见技术书籍及Vue核心内容整理): 响应式系统 响应式数据的基本原理 依赖收集与触发更新 实现简易响应式系统 Proxy与Refle…