vue2.0 实现导航守卫(路由守卫)


Posted in Javascript onMay 21, 2018

路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。

对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards)。

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

贴上文档地址:https://router.vuejs.org/zh-cn/advanced/navigation-guards.html

全局守卫

你可以使用 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。

下面写一个例子:

列举需要判断登录状态的“路由集合”,当跳转至集合中的路由时,如果“未登录状态”,则跳转到登录页面LoginPage;

当直接进入登录页面LoginPage时,如果“已登录状态”,则跳转到首页HomePage;

import Vue from 'vue';
import Router from 'vue-router';
import LoginPage from '@/pages/login';
import HomePage from '@/pages/home';
import GoodsListPage from '@/pages/good-list';
import GoodsDetailPage from '@/pages/good-detail';
import CartPage from '@/pages/cart';
import ProfilePage from '@/pages/profile';
Vue.use(Router)
const router = new Router({
 routes: [
 {
  path: '/', // 默认进入路由
  redirect: '/home' //重定向
 },
 {
  path: '/login',
  name: 'login',
  component: LoginPage
 },
 {
  path: '/home',
  name: 'home',
  component: HomePage
 },
 {
  path: '/good-list',
  name: 'good-list',
  component: GoodsListPage
 },
 {
  path: '/good-detail',
  name: 'good-detail',
  component: GoodsDetailPage
 },
 {
  path: '/cart',
  name: 'cart',
  component: CartPage
 },
 {
  path: '/profile',
  name: 'profile',
  component: ProfilePage
 },
 {
  path: '**', // 错误路由
  redirect: '/home' //重定向
 },
 ]
});
// 全局路由守卫
router.beforeEach((to, from, next) => {
 console.log('navigation-guards');
 // to: Route: 即将要进入的目标 路由对象
 // from: Route: 当前导航正要离开的路由
 // next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
 const nextRoute = ['home', 'good-list', 'good-detail', 'cart', 'profile'];
 let isLogin = global.isLogin; // 是否登录
 // 未登录状态;当路由到nextRoute指定页时,跳转至login
 if (nextRoute.indexOf(to.name) >= 0) { 
 if (!isLogin) {
  console.log('what fuck');
  router.push({ name: 'login' })
 }
 }
 // 已登录状态;当路由到login时,跳转至home
 if (to.name === 'login') {
 if (isLogin) {
  router.push({ name: 'home' });
 }
 }
 next();
});
export default router;

总结

以上所述是小编给大家介绍的vue2.0 实现导航守卫(路由守卫),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
document.documentElement && document.documentElement.scrollTop
Dec 01 Javascript
javascript 树控件 比较好用
Jun 11 Javascript
js post方式传递提交的实现代码
May 31 Javascript
Javascript 颜色渐变效果的实现代码
Oct 01 Javascript
jquery手风琴特效插件
Feb 04 Javascript
详解angular ui-grid之过滤器设置
Jun 07 Javascript
基于vue2实现左滑删除功能
Nov 28 Javascript
jQuery实现ajax的嵌套请求案例分析
Feb 16 jQuery
JS实现的贪吃蛇游戏案例详解
May 01 Javascript
vue实现倒计时获取验证码效果
Apr 17 Javascript
vue中在vuex的actions中请求数据实例
Nov 08 Javascript
用JS实现一个简单的打砖块游戏
Dec 11 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
May 21 #Javascript
JavaScript实现一个带AI的井字棋游戏源码
May 21 #Javascript
Vue中父子组件通讯之todolist组件功能开发
May 21 #Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
May 21 #Javascript
纯JS实现可用于页码更换的飞页特效示例
May 21 #Javascript
JS实现的文件拖拽上传功能示例
May 21 #Javascript
以v-model与promise两种方式实现vue弹窗组件
May 21 #Javascript
You might like
PHP学习之PHP变量
2006/10/09 PHP
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
Python socket处理client连接过程解析
2020/03/18 Python
django中嵌套的try-except实例
2020/05/21 Python
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
某公司面试题
2012/03/05 面试题
外贸销售员求职的自我评价
2013/11/23 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
疾病防治方案
2014/05/31 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
团代会开幕词
2015/01/28 职场文书
校运会广播稿
2015/08/19 职场文书