当前位置:首页 > VUE

vue实现动态路由菜单

2026-02-25 01:42:28VUE

Vue 实现动态路由菜单的方法

路由配置与动态加载

动态路由的核心在于通过后端接口获取菜单数据,并映射为前端路由。通常需要在路由配置中使用 addRoute 方法动态添加路由。

// router/index.js
const router = createRouter({ /* 基础配置 */ });

// 假设从后端获取菜单数据
const fetchMenuData = async () => {
  const response = await api.get('/menus');
  return response.data;
};

// 动态添加路由
const setupDynamicRoutes = async () => {
  const menus = await fetchMenuData();
  menus.forEach(menu => {
    router.addRoute({
      path: menu.path,
      component: () => import(`@/views/${menu.component}.vue`),
      meta: { title: menu.title }
    });
  });
};

菜单组件渲染

动态菜单组件通常通过递归方式渲染多级菜单结构,结合 v-for 和条件判断实现层级嵌套。

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

<script>
export default {
  name: 'MenuItem',
  props: {
    menuList: { type: Array, required: true }
  }
};
</script>

权限控制

动态路由常需结合权限验证,通过路由守卫检查用户是否有权访问目标路由。

router.beforeEach(async (to, from, next) => {
  const hasToken = localStorage.getItem('token');
  if (to.path === '/login') {
    next();
  } else if (!hasToken) {
    next('/login');
  } else if (!router.hasRoute(to.name)) {
    await setupDynamicRoutes();
    next(to.path); // 重定向到目标页
  } else {
    next();
  }
});

数据格式示例

后端返回的菜单数据通常需要包含路由关键字段,建议格式如下:

[
  {
    "path": "/dashboard",
    "component": "Dashboard",
    "meta": { "title": "控制台" }
  },
  {
    "path": "/user",
    "component": "UserLayout",
    "meta": { "title": "用户管理" },
    "children": [
      {
        "path": "list",
        "component": "UserList",
        "meta": { "title": "用户列表" }
      }
    ]
  }
]

缓存处理

为避免重复加载路由,可在 Vuex 或 Pinia 中存储已加载的路由状态:

vue实现动态路由菜单

// store/modules/permission.js
state: {
  loadedRoutes: []
},
mutations: {
  SET_ROUTES(state, routes) {
    state.loadedRoutes = routes;
  }
}

注意事项

  • 动态导入组件需确保 Webpack 能正确解析路径,建议使用明确的路径别名
  • 404 页面应在静态路由中配置,动态路由添加后需手动重定向
  • 菜单图标可通过 meta.icon 字段扩展,结合第三方图标库使用

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

相关文章

vue实现左右菜单

vue实现左右菜单

实现左右菜单的基本思路 使用Vue实现左右菜单通常需要两个主要组件:左侧的导航菜单和右侧的内容区域。左侧菜单用于导航,右侧区域根据菜单选择动态展示内容。 创建左侧菜单组件 左侧菜单通常是一个列表,可…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

vue实现折叠菜单

vue实现折叠菜单

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

Vue中实现路由

Vue中实现路由

Vue 路由的实现方法 在 Vue 中实现路由通常使用 Vue Router 库。以下是具体的实现步骤: 安装 Vue Router 通过 npm 或 yarn 安装 Vue Router: n…

php 实现级联菜单

php 实现级联菜单

实现级联菜单的方法 级联菜单(Cascading Dropdown)通常用于根据前一个选择动态加载下一个菜单的选项。以下是使用PHP和JavaScript(Ajax)实现级联菜单的详细方法。 数据库…

vue 底部菜单实现

vue 底部菜单实现

实现 Vue 底部菜单的方法 使用 v-if 或 v-show 控制显示 在 Vue 中可以通过条件渲染控制底部菜单的显示与隐藏。v-if 适合动态切换频率较低的场景,v-show 适合频繁切换的场景…