如何实现根据后端返回的 JSON 菜单树自动生成 Vue 路由表?动态实战

秋浩小哥_7455

秋浩小哥_7455

2026-05-31

386人浏览

原创

核心是解析后端JSON菜单树并动态生成Vue路由:约定字段(path/name/component/meta/children)→ 递归映射为路由配置 → 调用router.addRoute添加;需处理异步组件、权限过滤、嵌套路由及守卫校验。

如何实现根据后端返回的 json 菜单树自动生成 vue 路由表?动态实战

直接根据后端返回的 JSON 菜单树生成 Vue 路由表,核心在于「解析菜单结构 → 映射为路由配置 → 动态添加到 router 实例」。关键不是硬编码路由,而是建立菜单字段与路由属性(path、name、component、meta)之间的可靠映射规则,并处理好异步组件加载、权限过滤和嵌套路由。

1. 约定后端菜单 JSON 结构

前后端需提前约定字段语义,避免解析歧义。推荐基础字段如下:

  • id:唯一标识(可选,用于权限比对)
  • path:前端路由 path(如 "/user/list"),支持带参数("/user/:id")
  • name:路由唯一 name(如 "UserList"),用于编程式导航和 keep-alive
  • component:组件路径字符串(如 "views/user/UserList.vue"),非绝对路径
  • redirect:重定向目标(如 "/user/list")
  • meta:扩展信息对象,含 title、icon、hidden、permission 等
  • children:子菜单数组(递归)

示例片段:

[
  {
    "path": "/user",
    "name": "User",
    "component": "layout/RouteView",
    "meta": { "title": "用户管理", "icon": "user" },
    "children": [
      {
        "path": "list",
        "name": "UserList",
        "component": "views/user/UserList.vue",
        "meta": { "title": "用户列表" }
      }
    ]
  }
]

2. 编写菜单转路由的递归解析函数

在 router/index.js 或单独 utils 文件中实现,重点处理:

  • 路径拼接(父级 path + 子级 path,自动补 /)
  • 异步组件动态 import(用 defineAsyncComponent 或直接 import())
  • 跳过无 component 的目录级节点(仅作分组,不生成真实路由)
  • 过滤掉 meta.hidden === true 的项(不显示在菜单,但可能仍需路由)

Vue 3 + Vue Router 4 示例代码:

import { createRouter, createWebHashHistory } from 'vue-router'
import { defineAsyncComponent } from 'vue'

const layout = () => import('@/layout/RouteView.vue')

// 根据菜单项生成单个路由记录
function genRouteFromMenu(menu) {
  const route = {
    path: menu.path,
    name: menu.name,
    meta: menu.meta || {},
    redirect: menu.redirect
  }

  // 有 component 才是真实页面路由
  if (menu.component) {
    // 若是 layout,则用 layout;否则动态加载页面组件
    const compPath = menu.component.startsWith('layout/')
      ? `@/layout/${menu.component.split('layout/')[1]}`
      : `@/views/${menu.component.replace('.vue', '')}`
    
    route.component = defineAsyncComponent(() => import(compPath))
  } else {
    route.component = layout // 默认用 Layout 包裹子路由
  }

  // 递归处理 children
  if (Array.isArray(menu.children) && menu.children.length) {
    route.children = menu.children.map(genRouteFromMenu)
  }

  return route
}

// 导出生成函数(供后续调用)
export function generateRoutesFromMenus(menus) {
  return menus.map(genRouteFromMenu)
}

3. 在登录后动态添加路由

不能在初始 router 中写死所有路由。典型流程:

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载
  • 用户登录成功,调用接口获取菜单 JSON
  • 用 generateRoutesFromMenus() 解析成路由数组
  • 调用 router.addRoute() 或 router.addRoutes()(v4.1+ 推荐逐个 addRoute)
  • 手动刷新导航(router.replace(...) 避免重复 history 记录)

在登录逻辑中(如 store action 或 setup):

import { useRouter } from 'vue-router'
import { generateRoutesFromMenus } from '@/router/generator'

const router = useRouter()

// 假设已拿到 menus 数组
const asyncRoutes = generateRoutesFromMenus(menus)

asyncRoutes.forEach(route => {
  router.addRoute(route) // 动态注册
})

// 确保新路由生效,跳转到首个可访问页面
await router.replace({ path: asyncRoutes[0]?.children?.[0]?.path || asyncRoutes[0]?.path || '/home' })

4. 注意权限与守卫配合

动态路由只是第一步。还需结合路由守卫做权限控制:

  • 全局前置守卫中检查当前路由 meta.permission 是否在用户权限列表内
  • 菜单 JSON 中的 permission 字段(如 ["user:list", "user:add"])需与后端权限码一致
  • 若无权限,重定向到 403 页面或首页

示例守卫逻辑:

router.beforeEach((to, from, next) => {
  const permissions = store.state.user.permissions // 用户权限数组
  const requiredPerms = to.meta.permission || []

  if (requiredPerms.length && !requiredPerms.some(p => permissions.includes(p))) {
    next({ name: '403' })
  } else {
    next()
  }
})

不复杂但容易忽略:动态添加的路由不会出现在 router.getRoutes() 的初始列表里,但会实时生效;keep-alive 缓存需用 include 匹配 name,所以 name 字段必须唯一且稳定;生产环境注意 Webpack 懒加载 chunk 名冲突,可通过 webpackChunkName 注释优化。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

vue js json 路由

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2923

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7270

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6826

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2923

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

6363

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7270

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

7118

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

1023

5

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2295

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.5万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.6万人学习