Vue之它的七个路由钩子函数

281 阅读3分钟

路由钩子函数

路由独享钩子

1.router.beforeEnter是加载到页面之前做的事

image.png 这个是路由的独享钩子,beforeEnter 守卫 只在进入路由时触发,不会在 paramsquery 或 hash 改变时触发。

全局前置守卫

2.router.beforeEach() 一般用来做一些进入页面的限制。比如没有登录,就不能进入某些页面,只有登录了之后才有权限查看某些页面。。。说白了就是路由拦截。

image.png 这里奉上一段路由守卫的代码,to: 即将要进入的目标(是跳转后的页面路由) from: 当前导航正要离开的路由 (跳转前的)next 是必须要执行的,加上next路由才会跳转

全局解析守卫

3.router.beforeResolve 全局解析守卫 注册一个全局守卫。这和 router.beforeEach 类似,因为它在 每次导航时都会触发,但是确保在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被正确调用router.beforeResolve 是获取数据或执行任何其他操作(如果用户无法进入页面时你希望避免执行的操作)的理想位置。

image.png

路由后置守卫

1.router.afterEach

你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:

image.png

组件内的守卫(路由组件内直接定义路由导航守卫(传递给路由配置的))

  1. beforeRouteEnter beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。
       在渲染该组件的对应路由被验证前调用
       不能获取组件实例 `this` !
       因为当守卫执行时,组件实例还没被创建!

不过,你可以通过传一个回调给 next 来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数:

beforeRouteEnter (to, from, next) {
  next(vm => {
    // 通过 `vm` 访问组件实例
  })
}

注意 beforeRouteEnter 是支持给 next 传递回调的唯一守卫。对于 beforeRouteUpdate 和 beforeRouteLeave 来说,this 已经可用了,所以不支持 传递回调,因为没有必要了

2.beforeRouteUpdate

     在当前路由改变,但是该组件被复用时调用
     举例来说,对于一个带有动态参数的路径 `/users/:id`,在 `/users/1``/users/2` 之间跳转的时候,
     由于会渲染同样的 `UserDetails` 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
     因为在这种情况发生的时候,组件已经挂载好了,导航守卫可以访问组件实例 `this`

3.beforeRouteLeave 这个 离开守卫 通常用来预防用户在还未保存修改前突然离开。该导航可以通过返回 false 来取消。

 // 在导航离开渲染该组件的对应路由时调用
    // 与 `beforeRouteUpdate` 一样,它可以访问组件实例 `this`