Vue 路由守卫

108 阅读2分钟

了解Vue 路由守卫

Vue-Router导航守卫:

有的时候,我们需要通过路由来进行一些操作,比如最常见的登录权限验证,当用户满足条件时,才让其进入导航,否则就取消跳转,并跳到登录页面让其登录。
为此我们有很多种方法可以植入路由的导航过程:全局的, 单个路由独享的, 或者组件级的,推荐优先阅读路由文档

全局守卫

vue-router全局有三个守卫:
router.beforeEach 全局前置守卫 进入路由之前
router.beforeResolve 全局解析守卫(2.5.0+) 在beforeRouteEnter调用之后调用
router.afterEach 全局后置钩子 进入路由之后
使用方法:

// main.js 入口文件  
import router from './router'// 引入路由  
    router.beforeEach((to, from, next) => {   
    next();  
});  
router.beforeResolve((to, from, next) => {  
    next();  
});  
router.afterEach((to, from) => {  
    console.log('afterEach 全局后置钩子');  
});  

路由独享守卫

如果你不想全局配置守卫的话,你可以为某些路由单独配置守卫:

      routes: [  
        {  
          path: '/foo',  
          component: Foo,  
          beforeEnter: (to, from, next) => {   
            // 参数用法什么的都一样,调用顺序在全局前置守卫后面,所以不会被全局守卫覆盖  
            // ...  
          }  
        }  
      ]  
    })  

路由组件内的守卫:

beforeRouteEnter 进入路由前
beforeRouteUpdate (2.2) 路由复用同一个组件时
beforeRouteLeave 离开当前路由时
文档中的介绍:

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

 

beforeRouteEnter访问this

因为钩子在组件实例还没被创建的时候调用,所以不能获取组件实例 this,可以通过传一个回调给next来访问组件实例 。
但是回调的执行时机在mounted后面,所以在我看来这里对this的访问意义不太大,可以放在created或者mounted里面。

 beforeRouteEnter (to, from, next) {  
    console.log('在路由独享守卫后调用');  
      next(vm => {  
        // 通过 `vm` 访问组件实例`this` 执行回调的时机在mounted后面,  
      })  
    }