当前位置:首页 > VUE

vue路由菜单怎么实现

2026-02-24 14:06:09VUE

Vue 路由菜单的实现方法

在 Vue 项目中,可以通过 Vue Router 结合动态菜单数据来实现路由菜单。以下是一种常见的实现方式:

安装 Vue Router

npm install vue-router

配置路由

// router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'

Vue.use(Router)

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home,
    meta: {
      title: '首页',
      icon: 'el-icon-house'
    }
  },
  {
    path: '/about',
    name: 'About',
    component: About,
    meta: {
      title: '关于',
      icon: 'el-icon-info'
    }
  }
]

const router = new Router({
  routes
})

export default router

创建菜单组件

<!-- components/Menu.vue -->
<template>
  <div class="menu">
    <el-menu
      :default-active="$route.path"
      router
      mode="horizontal"
    >
      <el-menu-item
        v-for="route in menuRoutes"
        :key="route.path"
        :index="route.path"
      >
        <i :class="route.meta.icon"></i>
        <span>{{ route.meta.title }}</span>
      </el-menu-item>
    </el-menu>
  </div>
</template>

<script>
export default {
  computed: {
    menuRoutes() {
      return this.$router.options.routes.filter(route => route.meta)
    }
  }
}
</script>

在主应用中使用菜单

vue路由菜单怎么实现

<!-- App.vue -->
<template>
  <div id="app">
    <Menu />
    <router-view/>
  </div>
</template>

<script>
import Menu from './components/Menu.vue'

export default {
  components: {
    Menu
  }
}
</script>

动态菜单的实现

对于需要从后端获取菜单数据的场景:

修改菜单组件

<!-- components/DynamicMenu.vue -->
<template>
  <div class="menu">
    <el-menu
      :default-active="$route.path"
      router
    >
      <template v-for="item in menuData">
        <el-submenu
          v-if="item.children"
          :key="item.path"
          :index="item.path"
        >
          <template slot="title">
            <i :class="item.meta.icon"></i>
            <span>{{ item.meta.title }}</span>
          </template>
          <el-menu-item
            v-for="child in item.children"
            :key="child.path"
            :index="child.path"
          >
            {{ child.meta.title }}
          </el-menu-item>
        </el-submenu>
        <el-menu-item
          v-else
          :key="item.path"
          :index="item.path"
        >
          <i :class="item.meta.icon"></i>
          <span>{{ item.meta.title }}</span>
        </el-menu-item>
      </template>
    </el-menu>
  </div>
</template>

<script>
export default {
  data() {
    return {
      menuData: []
    }
  },
  async created() {
    const response = await fetch('/api/menus')
    this.menuData = await response.json()
  }
}
</script>

权限控制菜单

可以通过路由守卫和菜单过滤实现权限控制:

vue路由菜单怎么实现

添加路由守卫

// router/index.js
router.beforeEach((to, from, next) => {
  const hasPermission = checkPermission(to)
  if (!hasPermission) {
    next('/403')
  } else {
    next()
  }
})

function checkPermission(route) {
  // 实现权限检查逻辑
  return true
}

过滤菜单数据

// 在菜单组件中
computed: {
  filteredMenu() {
    return this.menuData.filter(item => {
      return this.$store.state.user.roles.some(role => 
        item.meta.roles.includes(role)
      )
    })
  }
}

多级菜单的实现

对于复杂的多级菜单结构:

// 路由配置示例
{
  path: '/system',
  name: 'System',
  meta: {
    title: '系统管理',
    icon: 'el-icon-setting'
  },
  children: [
    {
      path: 'user',
      name: 'User',
      component: User,
      meta: {
        title: '用户管理'
      }
    },
    {
      path: 'role',
      name: 'Role',
      component: Role,
      meta: {
        title: '角色管理'
      }
    }
  ]
}

以上方法提供了从基础到高级的 Vue 路由菜单实现方案,可以根据项目需求选择适合的方式。

标签: 路由菜单
分享给朋友:

相关文章

css制作横向菜单

css制作横向菜单

使用浮动(Float)实现横向菜单 将菜单项的 display 属性设置为 float: left,使列表项横向排列。清除浮动避免影响后续布局。 ul.horizontal-menu { lis…

vue路由实现内部切换

vue路由实现内部切换

Vue路由实现内部切换的方法 Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。以下是几种常见的路由切换方式: 使用<router-link>组件 &l…

jquery菜单

jquery菜单

以下是关于使用jQuery创建交互式菜单的几种常见方法及实现示例: 基础下拉菜单实现 通过jQuery的slideToggle和toggleClass实现简单下拉效果: $('.menu-item…

vue实现折叠菜单

vue实现折叠菜单

实现折叠菜单的基本思路 在Vue中实现折叠菜单通常涉及使用组件化开发,结合状态管理控制菜单的展开与折叠。核心是通过v-show或v-if动态切换子菜单的显示状态,并通过事件触发(如点击)改变状态。…

vue实现级联菜单

vue实现级联菜单

实现级联菜单的基本思路 Vue中实现级联菜单通常需要以下关键点:数据结构的组织、组件间的通信、动态渲染子菜单。一般采用递归组件或逐层渲染的方式实现。 数据结构设计 级联菜单的数据通常为嵌套结构,例如…

vue实现路由缓存

vue实现路由缓存

Vue 路由缓存实现方法 在 Vue 项目中,可以通过 keep-alive 组件和路由配置实现页面缓存,避免重复渲染和保持组件状态。 使用 keep-alive 包裹路由视图 在根组件或布局组件中…