关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法


Posted in Javascript onDecember 09, 2018

 #在切换路由时,组件会被复用,不过,这也意味着组件的生命周期钩子不会再被调用。

 解决办法有两种,1简单地 watch (监测变化) $route 对象:

const User = {
 template: '...',
 watch: {
  '$route' (to, from) {
   // 对路由变化作出响应...
  }
 }
}

2.使用 2.2 中引入的 beforeRouteUpdate 导航守卫:

const User = {
 template: '...',
 beforeRouteUpdate (to, from, next) {
  // react to route changes...
  // don't forget to call next()
 }
}

#全局守卫

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

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
 // ...
})

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

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

•next: Function: 一定要调用该方法来 resolve 这个钩子

#全局解析守卫

在 2.5.0+ 你可以用 router.beforeResolve 注册一个全局守卫。这和 router.beforeEach 类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。

#全局后置钩子

你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:

router.afterEach((to, from) => {
 // ...
})

#路由独享的守卫

你可以在路由配置上直接定义 beforeEnter 守卫

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

这些守卫与全局前置守卫的方法参数是一样的。

#组件内的守卫

你可以在路由组件内直接定义以下路由导航守卫:

const Foo = {
 template: `...`,
 beforeRouteEnter (to, from, next) {
  // 在渲染该组件的对应路由被 confirm 前调用
  // 不!能!获取组件实例 `this`
  // 因为当守卫执行前,组件实例还没被创建
 },
 beforeRouteUpdate (to, from, next) {
  // 在当前路由改变,但是该组件被复用时调用
  // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
  // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
  // 可以访问组件实例 `this`
 },
 beforeRouteLeave (to, from, next) {
  // 导航离开该组件的对应路由时调用
  // 可以访问组件实例 `this`
 }
}

beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。

不过,你可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。

export default {
  data(){
    return {
       num: 18
    }
  },
  beforeRouteEnter(to, from, next){
    next(vm=>{
      vm.num=22;
    })
  }
}

注意 beforeRouteEnter 是支持给 next 传递回调的唯一守卫。对于 beforeRouteUpdate 和 beforeRouteLeave 来说,this 已经可用了,所以不支持传递回调,因为没有必要了

#完整的导航解析流程

1.导航被触发。
2.在失活的组件里调用离开守卫。
3.调用全局的 beforeEach 守卫。
4.在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
5.在路由配置里调用 beforeEnter。
6.解析异步路由组件。
7.在被激活的组件里调用 beforeRouteEnter。
8.调用全局的 beforeResolve 守卫 (2.5+)。
9.导航被确认。
10.调用全局的 afterEach 钩子。
11.触发 DOM 更新。
12.用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

#在全局导航守卫中检查元字段

router.beforeEach((to, from, next) => {
 if (to.matched.some(record => record.meta.requiresAuth)) {
  //如果路由中有meta的requireAuth,且为true,就不进行登录验证,否则进行登录验证
  if (!auth.loggedIn()) {
   next({
    path: '/login',
    query: { redirect: to.fullPath }
   })
  } else {
   next()
  }
 } else {
  next() // 确保一定要调用 next()
 }
})

一个路由匹配到的所有路由记录会暴露为 $route 对象 (还有在导航守卫中的路由对象) 的 $route.matched 数组。因此,我们需要遍历 $route.matched 来检查路由记录中的 meta 字段。

注:1、meta 字段就是路由元信息字段,requiresAuth 是自己起的字段名称,用来标记这个路由信息是否需要检测,true 表示要检测,false 表示不需要检测(这个名称随便起,比如我自己的就起的 requiresId,建议起个有意义的名称)

2、if (to.matched.some(record => record.meta.requiresAuth) ),如果对这类写法不熟悉,可以去看看es6的箭头函数,这句话就是返回遍历的某个路由对象,我们定义为为record,检测这个对象是否拥有meta这个对象,如果有meta这个对象,检测它的meta对象是不是有requiresAuth这个属性,且为true,如果满足上述条件,就确定了是这个/foo/bar路由。

3、some() 方法测试数组中的某些元素是否通过了指定函数的测试。语法:arr.some(callback[, thisArg]);

some 为数组中的每一个元素执行一次 callback 函数,直到找到一个使得 callback 返回一个“真值”(即可转换为布尔值 true 的值)。如果找到了这样一个值,some 将会立即返回 true。否则,some 返回 false。callback 只会在那些”有值“的索引上被调用,不会在那些被删除或从来未被赋值的索引上调用。

 

 callback 被调用时传入三个参数:元素的值,元素的索引,被遍历的数组。

4、vue-router路由元信息说白了就是通过meta对象中的一些属性来判断当前路由是否需要进一步处理,如果需要处理,按照自己想要的效果进行处理即可!

总结

以上所述是小编给大家介绍的关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 实现模态对话框 源代码大全
May 02 Javascript
javascript中input中readonly和disabled区别介绍
Oct 23 Javascript
子窗体与父窗体传值示例js代码
Aug 01 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
Apr 23 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
Mar 06 Javascript
微信小程序 支付功能实现PHP实例详解
May 12 Javascript
原生js 封装get ,post, delete 请求的实例
Aug 11 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
Nov 03 Javascript
React.js绑定this的5种方法(小结)
Jun 05 Javascript
JavaScript多种页面刷新方法小结
Apr 04 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
Oct 29 Javascript
vue打包之后生成一个配置文件修改接口的方法
Dec 09 #Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
Dec 09 #Javascript
JS数组去重的6种方法完整实例
Dec 08 #Javascript
原生JS实现的放大镜特效示例【测试可用】
Dec 08 #Javascript
JS实现的小火箭发射动画效果示例
Dec 08 #Javascript
jQuery时间戳和日期相互转换操作示例
Dec 07 #jQuery
ES6的Fetch异步请求的实现方法
Dec 07 #Javascript
You might like
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
JQuery实现简单时尚快捷的气泡提示插件
2012/12/20 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
Vue 设置axios请求格式为form-data的操作步骤
2019/10/29 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
Python os模块介绍
2014/11/30 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
化学教师教学反思
2014/01/17 职场文书
文秘大学生求职信
2014/02/25 职场文书
主题教育活动总结
2014/05/05 职场文书
保护环境倡议书范文
2014/05/13 职场文书
离婚财产分配协议书
2014/10/21 职场文书
选购到合适的激光打印机
2022/04/21 数码科技