当前位置:首页 > VUE

vue实现菜单调用

2026-01-12 00:50:35VUE

Vue 实现动态菜单调用的方法

使用路由配置生成菜单

在 Vue 项目中,可以通过路由配置自动生成菜单结构。路由配置通常包含 pathnamemeta 等信息,这些信息可用于构建菜单项。

// router/index.js
const routes = [
  {
    path: '/dashboard',
    name: 'Dashboard',
    meta: { title: '控制台', icon: 'el-icon-s-home' }
  },
  {
    path: '/user',
    name: 'User',
    meta: { title: '用户管理', icon: 'el-icon-user' },
    children: [
      {
        path: 'list',
        name: 'UserList',
        meta: { title: '用户列表' }
      }
    ]
  }
]

在组件中遍历路由配置生成菜单:

<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="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获取菜单数据

实际项目中,菜单数据通常由后端根据用户权限返回。可以创建 menuService 获取数据:

// services/menuService.js
export const getMenus = () => {
  return axios.get('/api/menus')
}

在组件中调用并渲染:

<script>
import { getMenus } from '@/services/menuService'

export default {
  data() {
    return {
      menus: []
    }
  },
  async created() {
    this.menus = await getMenus()
  }
}
</script>

<template>
  <el-menu>
    <template v-for="menu in menus">
      <el-submenu 
        v-if="menu.children" 
        :index="menu.id"
        :key="menu.id"
      >
        <template #title>{{ menu.title }}</template>
        <el-menu-item 
          v-for="child in menu.children" 
          :key="child.id" 
          :index="child.path"
        >
          {{ child.title }}
        </el-menu-item>
      </el-submenu>
      <el-menu-item 
        v-else 
        :index="menu.path" 
        :key="menu.id"
      >
        {{ menu.title }}
      </el-menu-item>
    </template>
  </el-menu>
</template>

递归组件实现多级菜单

对于深层级菜单,可以使用递归组件:

<template>
  <el-menu>
    <menu-item 
      v-for="item in menus" 
      :key="item.id" 
      :item="item"
    />
  </el-menu>
</template>

<script>
import MenuItem from './MenuItem.vue'

export default {
  components: { MenuItem },
  data() {
    return {
      menus: [
        {
          id: 1,
          title: '系统管理',
          children: [
            {
              id: 2,
              title: '用户管理',
              children: [
                { id: 3, title: '添加用户', path: '/user/add' }
              ]
            }
          ]
        }
      ]
    }
  }
}
</script>

MenuItem.vue 组件:

<template>
  <el-submenu v-if="item.children" :index="item.id">
    <template #title>{{ item.title }}</template>
    <menu-item 
      v-for="child in item.children" 
      :key="child.id" 
      :item="child"
    />
  </el-submenu>
  <el-menu-item v-else :index="item.path">
    {{ item.title }}
  </el-menu-item>
</template>

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

权限控制实现

结合权限系统,可以过滤用户可见的菜单项:

// utils/auth.js
export const filterMenus = (menus, permissions) => {
  return menus.filter(menu => {
    if (menu.permission && !permissions.includes(menu.permission)) {
      return false
    }
    if (menu.children) {
      menu.children = filterMenus(menu.children, permissions)
    }
    return true
  })
}

在组件中使用:

<script>
import { filterMenus } from '@/utils/auth'
import { getMenus } from '@/services/menuService'

export default {
  computed: {
    permissions() {
      return this.$store.state.user.permissions
    }
  },
  async created() {
    const allMenus = await getMenus()
    this.menus = filterMenus(allMenus, this.permissions)
  }
}
</script>

动态路由与菜单结合

对于权限系统,可能需要动态添加路由:

// router/index.js
export function generateRoutes(menus) {
  const routes = []
  menus.forEach(menu => {
    const route = {
      path: menu.path,
      name: menu.name,
      component: () => import(`@/views/${menu.component}`)
    }
    if (menu.children) {
      route.children = generateRoutes(menu.children)
    }
    routes.push(route)
  })
  return routes
}

// 在登录后调用
const newRoutes = generateRoutes(menusFromBackend)
router.addRoutes(newRoutes)

vue实现菜单调用

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

相关文章

订单 vue实现

订单 vue实现

Vue 实现订单功能 数据模型设计 订单功能通常需要设计以下数据结构: // 订单数据结构 const order = { id: '', // 订单ID userId:…

vue卖座网实现

vue卖座网实现

Vue 卖座网实现 项目结构搭建 使用 Vue CLI 快速初始化项目,安装必要依赖如 Vue Router、Vuex、Axios。 创建核心目录结构:components(通用组件)、views(页…

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。…

vue设计与实现下载

vue设计与实现下载

vue设计与实现电子书下载 《Vue.js设计与实现》是一本深入解析Vue.js框架原理的书籍,由霍春阳(HcySunYang)撰写。以下是获取该资源的常见途径: 正版购买渠道 京东、…

vue调用接口实现退出

vue调用接口实现退出

实现Vue退出功能的步骤 在Vue中调用接口实现退出功能通常需要与后端API交互,以下是实现方法: 前端实现 创建退出方法,调用后端API接口: methods: { logout() {…

vue懒加载实现难吗

vue懒加载实现难吗

vue懒加载的实现难度 Vue懒加载的实现并不复杂,核心逻辑是通过动态导入(Dynamic Imports)和路由配置或组件异步加载完成。以下是具体实现方法: 路由懒加载实现 在Vue Router…