Vue Router的导航守卫总结

导航守卫

解释:“导航”表示路由正在发生改变;

导航守卫的作用

Vue Router 提供的导航守卫主要用来通过跳转或者取消跳转的方式来守卫导航;一个简单的例子:从一个界面跳转到另一个新的界面中,如果需要满足特定的条件才能发生跳转,这时候就需要用到导航守卫(钩子函数),比如:从商品界面需要跳转到购物车界面,在这个过程中需要用户的登录状态,这样就可以在特定的导航钩子函数中进行判断,跳转还是取消跳转;

注意:当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行的,此时导航在所有守卫 解析 完之前一直处于等待中;也就是说导航的跳转与否完全取决于导航守卫,导航的跳转会在导航守卫在给出决定之前一直处于等待状态;

导航守卫的分类

一、全局导航守卫
全局导航守卫分为三种:

1.全局前置守卫 —— router.beforeEach()
我们可以使用 router.beforeEach() 注册一个全局前置守卫:
在这里插入图片描述
语法:正如上图中所示 router.beforeEach((to, from, next) => { // 函数处理代码 })
参数说明:每个守卫方法接受三个参数:

  • to:即将要进入的路由对象;
  • from:当前路由正要离开的路由对象;
  • next:一定要调用该方法来解析这个钩子,否则在导航跳转时没有任何效果。执行效果依赖 next 方法的调用参数;
    • next():进行管道的下一个钩子;
    • next(false):中断当前的导航;
    • next(’/’) 或者 next({ path: ‘/’ }):跳转到一个不同的地址,在导航到一个界面时,如果不满足跳转条件,使用该方法跳转到另一个界面,代码示例如下:
      在这里插入图片描述
      在这里插入图片描述

2.全局后置守卫 —— router.afterEach()
可以使用 router.afterEach() 注册一个全局后置守卫,和其他守卫(包括组单个路由独享的守卫以及组件中的守卫)不同的是,全局后置守卫不会接受 next() 函数,也不会改变导航本身;
在这里插入图片描述
语法:正如上图中所示 router.afterEach((to, from) => { // 函数处理代码 })

3.全局解析守卫 —— router.beforeResolve()
2.5.0 新增。在2.5.0+你可以使用 router.beforeResolve() 注册一个全局解析守卫。

二、(单个)路由独享的守卫
单个路由独享的守卫只有一种:

我们可以在路由配置上直接定义 beforeEnter 守卫:
在这里插入图片描述

三、组件中的守卫
组件内的守卫分为三种:
  • beforeRouterEnter()
  • beforeRouterUpdate() 2.2新增
  • beforeRouterLeave()
    在这里插入图片描述

注意:beforeRouterEnter 守卫不能访问this,因为守卫在导航确认前被调用,因此即将登场的新组建还没被创建;

可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。
在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/qq_40117020/article/details/108519620