当前位置:首页 > 技术分析 > 正文内容

Vue Router 4 动态添加路由详解_vue动态添加路由思路

ruisui883个月前 (02-13)技术分析12

服务端的数据

思考一下,前端在实现动态菜单的时候,服务端会返回什么样的数据?

创建一个菜单的时候,最基本的是不是得有一个id、标题、路由、组件、父菜单,至于可访问的权限,暂不考虑。

假设服务端给前端返回了一个树形结构的数据(其实大多数时候,服务端都是把数据一股脑丢给前端处理的,这里为了方便说明问题,处理成树形结构)

// 服务端返回的数据
// 一般这个数据是存放在store中
const menus = [
  {
  	id: 0,
    pid: 0,
    name: '',
    title: '初始化',
    path: '',
    component: '',
    children: [{
  		id: 2,
    	pid: 0,
    	title: '安装与配置',
    	name: 'home.install',
    	path: 'install',
    	component: 'views/install/Install'
  	}]
  }, {
   	id: 1,
    pid: 0,
    title: '基础知识',
    name: '',
    path: '',
    component: '',
    children: [{
    	id: 3,
      pid: 1,
      title: '路由嵌套',
      name: 'home.nesting',
      path: 'nesting',
      component: 'views/nesting/Nesting'
    }]
  }
]



服务端数据转路由记录

需要将服务端返回的数据转成标准路由地址

/**
  * 将菜单数据转化成路由记录
  * @param data 菜单数据
  * @param parent 
  * @return 路由记录数组
  **/
function transRoute(data) {
  // 路由记录数组
  const routes = []
	data.forEach(v => {
    
    // 判断路由地址是否存在
    if(v.path !== '') {
      // vite下动态加载组件方式
      const modules = import.meta.glob('../views/**/*.vue')
      
      // 路由记录对象
      const route = {}
      route.name = v.name
    	route.path = v.path
      // 这里会被解析成() => import('/src/views/xx/xx.vue')
      route.component = modules[`../${v.component}.vue`]
      routes.push(route)
    }
    
    // 如果菜单数据存在子节点children
  	if(v.children && v.children.length) {
    	transRoute(v.children)
    }
  })
  return routes
}


将路由记录数据动态挂载到router实例

/**
 * 动态添加路由
 * @param routes 路由记录数组
 * @param router router实例
 **/
export const addRouteDynamically = (routes, router) => {
  // 获取已挂载的routes路由记录,
  // 找到对应的静态路由,
  // 将对应的子路由动态添加到该静态路由
  // 最后挂载到router实例
  const _routes = router.options.routes
  _routes[1].children = [
    ..._routes[1].children, 
    ...routes
  ]
  router.addRoute(_routes[1])
}


解决浏览器刷新导致动态路由消失的问题

思路是,判断当前路由(to对应的路由地址)是否存在,不存在,则重新添加

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1909.html

标签: vue路由权限
分享给朋友:

“Vue Router 4 动态添加路由详解_vue动态添加路由思路” 的相关文章

Gitlab概览

Gitlab是开源的基于Git的仓库管理系统,也可以管理软件开发的整个生命周期,是项目管理和代码托管平台,支撑着整个DevOps的生命周期。Gitlab很容易选为GitHub,作为公司私有库管理的工具。我们可以用Gitlab Workflow来协同整个团队的软件开发管理过程。软件开发阶段Gitlab...

Gitlab 的使用和代码审查流程介绍

1、先简洁介绍下项目常用的信息-面板统计页面2、用户信息面板3、服务器信息4、项目信息5、重点介绍代码提交审核机制和授权合并机制开发人员推送代码的时候不能直接推送到master,否则就会报错。此时开发人员要本地新建分支然后在提交上来列出修改了哪些细节管理员可以管理这些分支合并到master6、指派合...

高效使用 Vim 编辑器的 10 个技巧

在 Reverb,我们使用 MacVim 来标准化开发环境,使配对更容易,并提高效率。当我开始使用 Reverb 时,我以前从未使用过 Vim。我花了几个星期才开始感到舒服,但如果没有这样的提示,可能需要几个月的时间。这里有十个技巧可以帮助你在学习使用 Vim 时提高效率。1. 通过提高按键重复率来...

BuildKit 镜像构建工具

#暑期创作大赛#快速开始 对于 Kubernetes 部署,请参阅examples/kubernetes。BuildKit 由buildkitd守护进程和buildctl客户端组成。虽然buildctl客户端可用于 Linux、macOS 和 Windows,但buildkitd守护程序目前仅适用于...

三勾商城(java+vue3)微信小程序商城+SAAS+前后端源码

项目介绍本系统功能包括: 前台展示+后台管理+SAAS管理端,包括最基本的用户登录注册,下单, 购物车,购买,结算,订单查询,收货地址,后台商品管 理,订单管理,用户管理等等功能,小伙伴一起来看看吧。三勾小程序商城基于springboot+element-ui+uniapp打造的面向开发的小程序商城...

Ruoyi-vue第五十二章:Uniapp小程序配置tabbar底部导航栏

一、功能实现效果如下图底部的tabbar二、uniapp的tabBar如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。在 pages.json 中提供 tabBar 配置,不仅仅是为了方便快速开发导航,更重要的是在App和小程序端提升性...