当前位置:网站首页 > Vue.js开发 > 正文

vue 路由守卫和路由拦截器(vue3.0路由守卫)



最近因为遇到了不少问题,在这里记录一下

首先是路由守卫,是不是感觉简简单单

但是在看别的项目时常常能看到next('/logon') 、 next(to) 或者 next({ ...to, replace: true }) 这又是啥意思呢

其实在路由守卫中,只有next()是放行,其他的诸如:next('/logon') 、 next(to) 或者 next({ ...to, replace: true })都不是放行,而是:中断当前导航,执行新的导航

可以这么理解:

next() 是放行,但是如果next()里有参数的话,next()就像被重载一样,就有了不同的功能。

而对于上面说的中断当前导航,执行新的导航打个比方:

现在我有一个守卫,在守卫中我使用next('/logon'),肯定有同学认为是会直接跳转到/logon路由:

如果把这个守卫改一下,当我在地址栏输入

我本来要去路由,因此执行了第一次

但是这个路由守卫中判断了如果要去的地方是,就执行,

所以想要访问可以这么看

我本来要去路由,因此执行了第一次

但是这个路由守卫中判断了如果要去的地方是,就执行,

所以想要访问可以这么看

注意:重点就在这,next('/logon')不是说直接去/logon路由,而是中断(不是CPU的那个中断!VUE中的中断就是此时不会执行router.afterEach(() => {})这一次路由守卫的操作,又进入一次路由守卫,就像嵌套一样,一层路由守卫,然后又是一层路由守卫,此时路由守卫进入到第二层时,to.path已经不是/home了,这个时候才执行next()放行操作。

正以为如此很多人在使用动态添加路由addRoutes()会遇到下面的情况:

在addRoutes()之后第一次访问被添加的路由会白屏,这是因为刚刚addRoutes()就立刻访问被添加的路由,然而此时addRoutes()没有执行结束,因而找不到刚刚被添加的路由导致白屏。因此需要从新访问一次路由才行。

该如何解决这个问题 ?

此时就要使用next({ ...to, replace: true })来确保addRoutes()时动态添加的路由已经被完全加载上去。

next({ ...to, replace: true })中的replace: true只是一个设置信息,告诉VUE本次操作后,不能通过浏览器后退按钮,返回前一个路由。

因此next({ ...to, replace: true })可以写成next({ ...to }),不过你应该不希望用户在addRoutes()还没有完成的时候,可以点击浏览器回退按钮搞事情吧。

其实next({ ...to })的执行很简单,它会判断:

如果参数to不能找到对应的路由的话,就再执行一次beforeEach((to, from, next)直到其中的next({ ...to})能找到对应的路由为止。

也就是说此时addRoutes()已经完成啦,找到对应的路由之后,接下来将执行前往对应路由的beforeEach((to, from, next) ,因此需要用代码来判断这一次是否就是前往对应路由的beforeEach((to, from, next),如果是,就执行next()放行。

如果守卫中没有正确的放行出口的话,会一直next({ ...to})进入死循环 !!!

因此你还需要确保在当addRoutes()已经完成时,所执行到的这一次beforeEach((to, from, next)中有一个正确的next()方向出口。

到此这篇vue 路由守卫和路由拦截器(vue3.0路由守卫)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 字符串转int js(字符串转int类型)2026-05-07 08:45:08
  • pcie5.0显卡插槽能上pcie4.0卡吗(pcie4.0的显卡能上在pcie3.0插槽上吗)2026-05-07 08:45:08
  • 如何安装vue-cli(如何安装vuecli)2026-05-07 08:45:08
  • 192.168.100.1随身wifi登录(192.168.100.1随身wifi登录器admin)2026-05-07 08:45:08
  • vue.js 菜鸟教程(vue.js使用教程)2026-05-07 08:45:08
  • 列表的增删改查方法(列表的增删和移动 js)2026-05-07 08:45:08
  • pcie5.0速度是多少(pcie4.0x4速度)2026-05-07 08:45:08
  • pcie5.0电源和普通的有什么分别(pcie5.0有什么用)2026-05-07 08:45:08
  • redhat最新版下载(redhat6.10下载)2026-05-07 08:45:08
  • 前端跨域调用js方法解决方案设计(前端跨域调用js方法解决方案设计问题)2026-05-07 08:45:08
  • 全屏图片