欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能

程序员文章站 2022-03-14 18:35:50
路由跳转前做一些验证,比如登录验证(未登录去登录页),是网站中的普遍需求。对此,vue-route 提供的 beforerouteupdate 可以方便地实现导航守卫(na...

路由跳转前做一些验证,比如登录验证(未登录去登录页),是网站中的普遍需求。对此,vue-route 提供的 beforerouteupdate 可以方便地实现导航守卫(navigation-guards)。

导航守卫(navigation-guards)这个名字,听起来怪怪的,但既然官方文档是这样翻译的,就姑且这么叫吧。

贴上文档地址:

先来摘抄一段文档中beforerouteupdate 的用法:

你可以使用 router.beforeeach 注册一个全局前置守卫:

const router = new vuerouter({ ... }) 
router.beforeeach((to, from, next) => { 
 // ... 
}) 

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。

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

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

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

next: function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

next(false): 中断当前的导航。如果浏览器的 url 改变了(可能是用户手动或者浏览器后退按钮),那么 url 地址会重置到 from 路由对应的地址。

next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。

next(error): (2.4.0+) 如果传入 next 的参数是一个 error 实例,则导航会被终止且该错误会被传递给 router.onerror() 注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved。

下面写一个例子,上一篇博客中我们的账户页,包括课程和订单,都需要在跳转前判断是不是已登录;已登录的情况再去登录页,跳转至首页:

const vuerouter = new router({ 
  routes: [ 
    //...... 
    { 
     path: '/account', 
     name: 'account', 
     component: account, 
     children: [ 
      {name: 'course', path: 'course', component: courselist}, 
      {name: 'order', path: 'order', component: orderlist} 
     ] 
    } 
  ] 
}); 
vuerouter.beforeeach(function (to, from, next) { 
  const nextroute = [ 'account', 'order', 'course']; 
  const auth = store.state.auth; 
  //跳转至上述3个页面 
  if (nextroute.indexof(to.name) >= 0) { 
    //未登录 
    if (!store.state.auth.islogin) { 
      vuerouter.push({name: 'login'}) 
    } 
  } 
  //已登录的情况再去登录页,跳转至首页 
  if (to.name === 'login') { 
    if (auth.islogin) { 
      vuerouter.push({name: 'home'}); 
    } 
  } 
  next(); 
}); 

总结

以上所述是小编给大家介绍的使用vue-route 的 beforeeach 实现导航守卫(路由跳转前验证登录)功能,希望对大家有所帮助