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

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

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

服务端的数据

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

创建一个菜单的时候,最基本的是不是得有一个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动态添加路由思路” 的相关文章

Ubuntu Linux 24.04 LTS发行版现已开放下载

IT之家 4 月 25 日消息,Ubuntu 24.04 长期支持版(LTS)“Noble Numbat” 现已发布,有需要的用户请通过官网下载发行版 ISO 镜像进行安装。Ubuntu 24.04 采用了 Linux 6.8 内核,可利用 Netplan 在桌面上配置网络连接,还配备了现代化的桌面...

微软的Linux发行版终于加入了对XFS根文件系统的支持

当许多Linux发行版在评估新的根文件系统选项或甚至像OpenZFS这样的特性,微软内部Linux发行版到本月才开始支持XFS作为根文件系统选项。随着这个月对微软内部Linux发行版CBL-Mariner的更新,他们现在支持XFS作为根文件系统。到目前为止,这个用于微软内部各种目的的Linux发行版...

学会使用Vue JSX,一车老干妈都是你的

作者:子君转发链接:https://mp.weixin.qq.com/s/eAOivpHeowLShfwPfW8-BA?君自前端来,应知前端事。需求时时变,bug改不完。?连续几篇文章,每篇都有女神,被老铁给吐槽了,今天不提了女神了,反正女神都是别人的(扎心了)。这两天小编看了腾讯与老干妈的事情,晚...

再来一波黑科技工具,低调使用

静读天下静读天下是一个特别优秀的电子书阅读器。它上面有多个在线书库,像古登堡计划,很多种优秀的书杂志,都可以下载来阅读。它还能智能识别章节功能,还支持外置的语音阅读功能。它支持多种文本格式,比如说txt,pdf,epub,mobi等等。为了便于阅读它还有10 种配色方式,还有夜间模式。不过免费版有广...

三维家-系统快捷键使用

快键件使用:通过简单的键盘+鼠标操作,快速完成搭配。1.基础快捷键1) Ctrl+V:复制选中对象第一步:鼠标左击物体,按下Ctrl+V 即可复制选中对象。2) Ctrl+G:组合多选对象第一步:按住Ctrl键多选对象--按住Ctrl+G--确定。3) Ctrl+B:解组选中对象第一步:左击选中对象...

js中数组filter方法的使用和实现

定义filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。语法var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])参数callback循环数组每个元素时调用的回调函数。回调函...