Vue Router 路由守卫(导航守卫)

1、是什么

简单来说,导航守卫就是路由跳转前、中、后过程中的一些钩子函数,这个函数能让你操作一些其他的事儿,这就是导航守卫。

官方解释,vue-router提供的导航守卫主要用来通过跳转或取消的方式守卫导航

2、导航守卫分类

导航守卫分为:全局的组件内的单个路由独享三种

2.1 全局的

路由实例上直接操作的钩子函数,他的特点是所有配置路由的组件都会触发

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
// ...
})

全局路由的钩子函数包括

  • beforeEach
    在路由跳转前触发,参数包括to,from,next(参数会单独介绍)三个,这个钩子作用主要是用于登录验证
  • beforeResolve(2.5+)
    这个钩子和beforeEach类似,也是路由跳转前触发,参数也是to,from,next三个,与beforeEach的区别参考官网。
  • afterEach
  • 是在路由跳转完成后触发,参数包括to,from,它发生在beforeEach和beforeResolve之后,beforeRouteEnter(组件内守卫)之前。
2.2 路由独享的

指在单个路由配置的时候也可以设置的钩子函数

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

路由独享的钩子函数包括

  • beforeEnter
    与全局的beforeEach完全相同,如果都设置则在beforeEach之后紧随执行,参数to、from、next
2.3 组件内的

指在组件内执行的钩子函数,类似于组件内的生命周期


export default{
  data(){
    //...
  },
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
} 
  

组件内的路由钩子函数包括

  • beforeRouteEnter
    路由进入组件之前调用,参数包括to,from,next。该钩子在全局守卫beforeEach和独享守卫beforeEnter之后,全局beforeResolve和全局afterEach之前调用,要注意的是该守卫内访问不到组件的实例,也就是this为undefined,也就是他在beforeCreate生命周期前触发。

  • beforeRouteUpdate
    在当前路由改变时,并且该组件被复用时调用,可以通过this访问实例。参数包括to,from,next。

  • beforeRouteLeave
    导航离开该组件的对应路由时调用,可以访问组件实例this,参数包括to,from,next。

3、导航守卫回调参数

  • to:目标路由对象;

  • from:即将要离开的路由对象;

  • next:他是最重要的一个参数,他相当于佛珠的线,把一个一个珠子逐个串起来。

next()详解:

1.但凡涉及到有next参数的钩子,必须调用next() 才能继续往下执行下一个钩子,否则路由跳转等会停止。

2.如果要中断当前的导航要调用next(false)。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到from路由对应的地址。(主要用于登录验证不通过的处理)

3.当然next可以这样使用,next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。意思是当前的导航被中断,然后进行一个新的导航。可传递的参数与router.push中选项一致。

4.在beforeRouteEnter钩子中next((vm)=>{})内接收的回调函数参数为当前组件的实例vm,这个回调函数在生命周期mounted之后调用,也就是,他是所有导航守卫和生命周期函数最后执行的那个钩子。

5.next(error): (v2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

参考链接:https://zhuanlan.zhihu.com/p/54112006

你可能感兴趣的:(Vue)