当前位置:首页 > VUE

vue实现菜单调用

2026-01-07 01:56:36VUE

Vue 实现动态菜单的常见方法

基于路由配置生成菜单

Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统:

// router/index.js
const routes = [
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: Dashboard,
    meta: { title: '控制台', icon: 'el-icon-monitor' }
  },
  {
    path: '/user',
    name: 'User',
    component: User,
    meta: { title: '用户管理', icon: 'el-icon-user' },
    children: [
      { path: 'list', component: UserList, meta: { title: '用户列表' } }
    ]
  }
]
<!-- MenuComponent.vue -->
<template>
  <el-menu :router="true">
    <template v-for="route in $router.options.routes">
      <el-submenu 
        v-if="route.children" 
        :index="route.path"
        :key="route.path">
        <template #title>
          <i :class="route.meta.icon"></i>
          <span>{{ route.meta.title }}</span>
        </template>
        <el-menu-item 
          v-for="child in route.children" 
          :key="child.path"
          :index="route.path + '/' + child.path">
          {{ child.meta.title }}
        </el-menu-item>
      </el-submenu>
      <el-menu-item v-else :index="route.path" :key="route.path">
        <i :class="route.meta.icon"></i>
        <span>{{ route.meta.title }}</span>
      </el-menu-item>
    </template>
  </el-menu>
</template>

后端返回菜单数据方案

适合需要动态权限控制的系统,通过 API 获取菜单数据:

vue实现菜单调用

// 示例数据结构
[
  {
    id: 1,
    name: "System",
    title: "系统管理",
    icon: "setting",
    children: [
      { id: 11, name: "User", title: "用户管理", path: "/user" }
    ]
  }
]
<script>
export default {
  data() {
    return {
      menuItems: []
    }
  },
  async created() {
    const res = await axios.get('/api/menus')
    this.menuItems = res.data
  }
}
</script>

<template>
  <el-menu>
    <template v-for="item in menuItems">
      <el-submenu 
        v-if="item.children" 
        :index="item.id.toString()"
        :key="item.id">
        <template #title>
          <i :class="'el-icon-' + item.icon"></i>
          <span>{{ item.title }}</span>
        </template>
        <el-menu-item 
          v-for="child in item.children" 
          :key="child.id"
          :index="child.path">
          {{ child.title }}
        </el-menu-item>
      </el-submenu>
      <el-menu-item v-else :index="item.path" :key="item.id">
        <i :class="'el-icon-' + item.icon"></i>
        <span>{{ item.title }}</span>
      </el-menu-item>
    </template>
  </el-menu>
</template>

递归组件实现多级菜单

对于不确定层级的深度嵌套菜单,可使用递归组件:

<!-- RecursiveMenu.vue -->
<template>
  <el-submenu 
    v-if="item.children"
    :index="item.path">
    <template #title>
      <i :class="item.icon"></i>
      <span>{{ item.title }}</span>
    </template>
    <recursive-menu 
      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.title }}</span>
  </el-menu-item>
</template>

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

权限过滤实现

结合权限系统过滤显示的菜单项:

vue实现菜单调用

computed: {
  filteredMenus() {
    return this.menuItems.filter(menu => {
      return this.$hasPermission(menu.permission)
    })
  }
}

菜单状态保持

使用 Vuex 或 Pinia 存储菜单展开状态:

// store/modules/menu.js
const state = {
  openedMenus: ['1'] // 默认展开的菜单ID
}

const mutations = {
  TOGGLE_MENU(state, menuId) {
    const index = state.openedMenus.indexOf(menuId)
    if (index > -1) {
      state.openedMenus.splice(index, 1)
    } else {
      state.openedMenus.push(menuId)
    }
  }
}

响应式处理

监听路由变化高亮当前菜单项:

watch: {
  '$route.path': {
    immediate: true,
    handler(path) {
      this.$refs.menu.activeIndex = path
    }
  }
}

通过组合这些方法,可以构建出适应不同业务场景的 Vue 菜单系统。实际实现时应根据项目需求选择路由映射、后端动态配置或混合模式。

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

相关文章

vue实现登录验证

vue实现登录验证

Vue 实现登录验证的方法 使用表单验证库 VeeValidate 安装 VeeValidate 库,可以快速实现表单验证功能。VeeValidate 提供了丰富的验证规则和错误提示功能。 npm…

vue实现图片搜索

vue实现图片搜索

Vue实现图片搜索功能 使用HTML5的File API获取图片 通过<input type="file">元素让用户选择图片文件,使用FileReader对象读取图片数据。 <…

vue搜索过后实现分页

vue搜索过后实现分页

Vue 实现搜索后分页功能 数据绑定与搜索逻辑 在 Vue 组件中定义必要的数据属性: data() { return { searchQuery: '', currentPag…

vue实现点击页面切换

vue实现点击页面切换

实现点击页面切换功能 在Vue中实现点击页面切换功能,可以通过路由跳转或组件动态渲染两种方式完成。以下是具体实现方法: 使用Vue Router实现页面跳转 安装Vue Router后,在项目中配置…

vue实现文字播放栏

vue实现文字播放栏

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

vue怎么实现文件树

vue怎么实现文件树

Vue 实现文件树的方法 使用递归组件 递归组件是处理嵌套数据结构的理想方式。文件树通常包含文件夹和文件的嵌套结构,适合用递归组件实现。 <template> <ul>…