Vuerouter的beforeEach与afterEach钩子函数的区别

柔情只为你懂 2022-02-13 14:15 399阅读 0赞

小编推荐:Fundebug提供JS错误监控、微信小程序错误监控、微信小游戏错误监控,Node.j错误监控和Java错误监控。真的是一个很好用的错误监控费服务,众多大佬公司都在使用。

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

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

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

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

两种函数:

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

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

全局钩子函数

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

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

beforeEach函数有三个参数:

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

afterEach函数不用传next()函数

某个路由的钩子函数

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

  1. const router = new VueRouter({
  2. routes: [
  3. {
  4. path: '/login',
  5. component: Login,
  6. beforeEnter: (to, from, next) => {
  7. // ...
  8. },
  9. beforeLeave: (to, from, next) => {
  10. // ...
  11. }
  12. }
  13. ]
  14. })

路由组件的钩子

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

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

  1. var routes = [
  2. {
  3. path:'/home',
  4. component:home,
  5. name:"home"
  6. }
  7. ]

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

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

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

  • beforeRouteEnter
  • beforeRouteUpdate (2.2 新增)
  • beforeRouteLeave

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

  1. beforeRouteLeave(to, from, next) {
  2. next()
  3. },
  4. beforeRouteEnter(to, from, next) {
  5. next()
  6. },
  7. beforeRouteUpdate(to, from, next) {
  8. next()
  9. },
  10. data:{},
  11. method: {}

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

源码:

  1. router.beforeEach((to, from, next) => {
  2. //判断登录状态简单实例
  3. var userInfo = window.localStorage.getItem('token');
  4. if (userInfo) {
  5. next();
  6. } else {
  7. next('/login');
  8. }
  9. })

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

![Image 1][]

解决方案:

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

解决思路:

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

作者:易水人去丶明月如霜
链接:https://www.jianshu.com/p/52bcff08c4ce

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,399人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM钩子函数

    1. 虚拟机退出:JVM会在所有非后台线程关闭后才会退出,如在一个main线程里新产生一个线程,而该线程阻塞了,那么虚拟机不会退出。后台线程会在所有非后台线程退出后都停止任务

    相关 Vue:routerbeforeEachafterEach钩子函数

    在路由跳转的时候,我们需要一些权限判断或者其他操作。这个时候就需要使用路由的钩子函数。 定义:路由钩子主要是给使用者在路由发生变化时进行一些特殊的处理而定义的函数。 总体来

    相关 钩子函数和回调函数区别

    很明显的差别就是:钩子函数在捕获消息的第一时间就执行,而回调函数是捕获结束时,最后一个被执行的。回调函数其实是调用者将回调函数的指针传递给了调用函数,当调用函数执行完毕后,通过