美文网首页
全局前置守卫beforeEach

全局前置守卫beforeEach

作者: Sallyzqc | 来源:发表于2019-11-27 14:24 被阅读0次

beforeEach 守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。

每个守卫方法接收三个参数:

to: Route: 即将要进入的目标路由对象

from: Route: 当前导航正要离开的路由

next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖next方法的调用参数。确保要调用next方法,否则钩子就不会被 resolved

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

  const localId = localStorage.getItem('userId');

  if (to.name === 'login') { // 访问login,缓存判断

    if (localId) { //有缓存,访问主页

      next({ name: 'main' });

    } else {// 无缓存,跳转登录页

      next();

    }

  } else if (to.name !== 'login' && localId) { // 访问非登录页,有缓存,继续跳转该页面

    next();

  } else if (to.name !== 'login' && !localId) {

    next({ name: 'login' }); // 访问非登录页,无缓存,跳转login

  }

});

 在这里需要注意的是,通过next({name:'xxx'}),就要通过to.name ==='login'去判断;如果是通过next({path:'xxx'})跳转,就要通过to.path==='/login'去判断,他们必须一一对应。这两种方式是改变路由的跳转路径,但是不管怎么样,最后一定要执行next()才可以被resolved。如果next()没有被执行,就会出现无限循环,最后浏览器就崩了!网上有很多文章写了关于beforeEach无限循环的问题,终其原因就是没有执行到next()。如果你的beforeEach出现了无限循环,耐心地在beforeEach函数中打上断点,检查自己的逻辑是不是没对。

另外需要说的一点是,在beforeEach里可能会有异步请求,如后台请求菜单,获取用户信息等等,需要在调用store的方法,调用时,beforeEach使用async修饰(如上文代码所示),函数调用时加上await关键字使得同步执行,如 await 

store.dispatch('getMenus', localId);这里也算是一个坑,需要格外注意。

总结一下

beforeEach收尾中必须要执行next()才不会出现无限循环

路由跳转时,属性需要一致,to.name/to.path等

在beforeEach中共调用store的异步函数,beforeEach加上async修饰,函数调用使用awaitstore.dispatch,awaitstore.dispatch('getMenus', localId);

相关文章

  • vue路由导航卫士

    全局守卫beforeEach : 全局前置守卫beforeResolve : 全局解析守卫afterEach :...

  • 路由守卫

    全局守卫 你可以使用 router.beforeEach 注册一个全局前置守卫: 当一个导航触发时,全局前置守卫按...

  • VUE2.0 —— 导航钩子函数

    模块一:全局导航钩子函数 1、vue router.beforeEach(全局前置守卫) beforeEach的钩...

  • vue之路由钩子函数-路由守卫

    模块一:全局导航钩子函数 1、vue router.beforeEach(全局前置守卫) beforeEach的钩...

  • 华云

    一,vue路由守卫的生命周期1,全局的前置路由守卫 router.beforeEach()2, 全局解析守卫 ...

  • Vue2.0系列(八)vue-router高阶

    一、导航守卫 1.1、全局守卫 router.beforeEach 注册一个全局前置守卫: 当一个导航触发时,全局...

  • Vue设置路由拦截

    路由守卫 在Vue中分为全局前置守卫 router.beforeEach ,和全局后置钩子 router.afte...

  • vue-router

    vue-router 有哪些钩子函数? 全局前置守卫 router.beforeEach 全局解析守卫 route...

  • 全局前置守卫beforeEach

    beforeEach 守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于等待中。 每个守卫方法...

  • vue router和vue属性

    vue router 安装 全局前置守卫 router.beforeEach 每个守卫方法接收三个参数: to: ...

网友评论

      本文标题:全局前置守卫beforeEach

      本文链接:https://www.haomeiwen.com/subject/fdypwctx.html