美文网首页让前端飞Vue.js开发技巧
Vuerouter的beforeEach与afterEach钩子

Vuerouter的beforeEach与afterEach钩子

作者: 88b61f4ab233 | 来源:发表于2019-02-20 14:36 被阅读18次

    在路由跳转的时候,我们需要一些权限判断或者其他操作。这个时候就需要使用路由的钩子函数。

    定义:路由钩子主要是给使用者在路由发生变化时进行一些特殊的处理而定义的函数。

    总体来讲vue里面提供了三大类钩子,两种函数

    1、全局钩子
    2、某个路由的钩子
    3、组件内钩子

    两种函数:

    1、Vue.beforeEach(function(to,form,next){}) /在跳转之前执行/

    2.Vue.afterEach(function(to,form))/在跳转之后判断/

    全局钩子函数

    顾名思义,它是对全局有效的一个函数

    router.beforeEach((to, from, next) => {
     
      let token = router.app.$storage.fetch("token");
     
      let needAuth = to.matched.some(item => item.meta.login);
     
      if(!token && needAuth) return next({path: "/login"});
     
      next();
     
    }); 
    

    beforeEach函数有三个参数:

    • to:router即将进入的路由对象
    • from:当前导航即将离开的路由
    • next:Function,进行管道中的一个钩子,如果执行完了,则导航的状态就是 confirmed (确认的);否则为false,终止导航。

    afterEach函数不用传next()函数

    某个路由的钩子函数

    顾名思义,它是写在某个路由里头的函数,本质上跟组件内函数没有区别。

    const router = new VueRouter({
     routes: [
      {
       path: '/login',
       component: Login,
       beforeEnter: (to, from, next) => {
        // ...
       },
       beforeLeave: (to, from, next) => {
        // ...
       }
      }
     ]
    })
    

    路由组件的钩子

    注意:这里说的是路由组件!

    路由组件 属于 组件,但组件 不等同于 路由组件!所谓的路由组件:直接定义在router中component处的组件。如:

    var routes = [
      {
      path:'/home',
      component:home,
      name:"home"
      }
    ]
    

    在子组件中调用路由的钩子函数时无效的。

    在官方文档上是这样定义的:

    可以在路由组件内直接定义以下路由导航钩子

    • beforeRouteEnter
    • beforeRouteUpdate (2.2 新增)
    • beforeRouteLeave

    这里简单说下钩子函数的用法:它是和data,methods平级的。

    beforeRouteLeave(to, from, next) {
      next()
    },
    beforeRouteEnter(to, from, next) {
      next()
    },
    beforeRouteUpdate(to, from, next) {
      next()
    },
    data:{},
    method: {}
    

    PS:在使用vue-router beforeEach钩子时,你也许会遇到如下问题:

    源码:

    router.beforeEach((to, from, next) => {
    //判断登录状态简单实例
    var userInfo = window.localStorage.getItem('token');
    if (userInfo) {
    next();
    } else {
    next('/login');
    }
    })
    

    然后你会发现出现如下错误:出现dead loop错误



    解决方案:

    router.beforeEach((to, from, next) => {
    var userInfo = window.localStorage.getItem('token');//获取浏览器缓存的用户信息
    if(userInfo){ //如果有就直接到首页咯
    next();
    } else {
    if(to.path=='/login'){ //如果是登录页面路径,就直接next()
    next();
    } else { //不然就跳转到登录;
    next('/login');
    }
     
    }
    })
    

    解决思路:

    排除此时地址 = 转向的地址 的情况,避免dead loop, 问题很简单,但一不小心就入坑了

    最后

    为了帮助大家让学习变得轻松、高效,给大家免费分享一大批资料,帮助大家在成为全栈工程师,乃至架构师的路上披荆斩棘。在这里给大家推荐一个前端全栈学习交流圈:866109386.欢迎大家进群交流讨论,学习交流,共同进步。

    当真正开始学习的时候难免不知道从哪入手,导致效率低下影响继续学习的信心。

    但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终浪费大量时间,所以有有效资源还是很有必要的。

    最后祝福所有遇到瓶疾且不知道怎么办的前端程序员们,祝福大家在往后的工作与面试中一切顺利。


    相关文章

      网友评论

        本文标题:Vuerouter的beforeEach与afterEach钩子

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