Vue 导航守卫

474 阅读2分钟

全局守卫

  • 每次路由跳转都会被触发
router.beforeEach((to, from, next) => {
    //全局前置守卫,当一个导航触发时,全局前置守卫按照创建顺序调用
    //数据校验时,非常有用if(to.fullpath==="/home"){next('/login')}
    console.log("全局---------------------")
    console.log("beforeEach", to, from)
    next()
})

router.beforeResolve((to, from, next) => {
    //全局解析守卫,2.5.0新增,这和router.beforeEach类似,区别是再导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用
    console.log("全局---------------------")
    console.log("beforeResolve", to, from)
    next()
})
router.afterEach((to, from) => {
    //全局后置钩子
    console.log("全局---------------------")
    console.log("afterEach")
})

路由独享的守卫

  • 写在路由配置里
export default new Router({
    mode: 'history',
    base: process.env.BASE_URL,
    routes: [{
        path: "/",
        redirect: "/a"
    }, {
        path: "/a/:id",
        //路由独享的守卫
        beforeEnter: (to, from, next) => {
            console.log("路由---------------------")
            console.log('before enter');
            next()
        },
        component: pageA
    }, {
        path: "/b",
        component: pageB
    }]
})

组件内的守卫

在路由组件内直接定义一下路由导航守卫

  beforeRouteEnter (to, from, next) {
        // 在渲染改组件的对应路由被confirm前调用
        //不能获取组件实例this
        //因为当守卫执行前,组件实例还没被创建
        console.log("组件---------------------")
        console.log(this,"beforeRouteEnter");
        next()
    },
    beforeRouteUpdate(to, from, next) {
        //在当前路由改变,但是改组件被复用时调用
        //举例来说,对于一个带有动态参数的路径 /a/:id,在/a/1和/a/2之间跳转的时候,
        //由于会渲染同样的pageA组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
        //可以访问组件实例 this
        console.log("组件---------------------")
        console.log(this,"beforeRouterUpdate")
        next()
    },
    beforeRouteLeave (to, from, next) {
        //导航离开改组件的对应路由时调用
        //可以访问组件实例 this
        //通常用来禁止用户在还未保存修改前突然离开。该导航可以通过next(false)来取消
        console.log("组件---------------------")
        console.log(this,"beforeRouteLeave")
        next()
    }

总结:

  1. 导航被触发
  2. 调用全局的beforeEach守卫
  3. 在重用的组件里调用beforeRouteUpdate守卫
  4. 在路由配置里调用beforeEnter
  5. 在被激活的组件里调用beforeRouteEnter
  6. 调用全局的beforeResolve守卫
  7. 导航被确认
  8. 调用全局的afterEach钩子
  9. 触发DOM更新