• 1.导航被触发
  • 2.在失活的组件里调用离开守卫:beforeRouteLeave —— 组件内守卫(离开组件)。
  • 3.调用全局的beforeEach守卫 —— 全局守卫(进入组件)。
  • 4.在重用组件里调用deforeRouteUpdatar守卫(2.2+)—— 组件内守卫(组件复用时调用/foo/:id)。
  • 5.在路由配置里调用beforeEnter。—— 路由独享守卫(进入组件)。
  • 6.解析异步路由组件。
  • 7.在被激活的组件里调用beforeRouteEnter。—— 组件内守卫(进入组件)。
  • 8.调用全局的beforesolve守卫(2.5)。—— 全局解析守卫,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。
  • 9.导航被确认。
  • 10.调用全局的afterEach钩子。——全局后置钩子(确定要进入的路由之后,vue实例创建之前,这个钩子只接收to,from两个参数,没有next参数)。
  • 11.触发DOM更新。

一、导航守卫

官方手册:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html

vue-router的导航守卫在官方中有很详细的说明,应用也是比较简单,主要并不在于导航本身的应用,而是要理解导航守卫的所有API是在离开当前路由组件之后,进入新的路由组件之前被触发,在这个过程中来实现是否决定进入下一个路由组件或者留在当前路由组件,还是重定向到别的组件中,主要用于处理路由切换业务。导航守卫的业务必定会存在路由之间的数据操作,这时候就需要配置路由元信息来实现。

 1.全局前置守卫:
 const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
// ...
})
  • to:Route:即将要进入的目标路由对象
  • from:Route:当前导航要离开的路由
  • next:function:最后调用该方法来resolve这个钩子(最终决定渠道那个路由组件),执行next方法需要的参数:
next() //去到目标路由对象
next(false) //中断导航,留在真要离开的from路由。如果浏览器的URL地址改变(用户手动或者浏览器后退按钮),那么url地址会重置到from路由对应的地址
next('/')
next({path:'/'}) //跳转到指定的地址,当前导航中断,然后进入到一个新的导航
next(error) //2.4.0如果传入next的参数是一个Error实例,则导航会被终止且该错误会被传递给router.onError()注册过的回调。

要确保next()方法调用,不然钩子就不会被resolved。

 2.其他守卫:

导航守卫API的参数几乎没有差别,基本上都使用“to,from,next”这三个参数,几乎vue实例在这些路由API中也不能用this获取,这时候获取的this基本上都是undefined,但也有例外:

router.beforeResolve((to,from,next) => {})//全局解析守卫 this指向undefined
router.afterEach((to,from) => {}) //全局后置守卫没有next参数,并且this指向也是undefined
beforeEnter:(to,from,next) => {} //路由独享守卫,this指向undefined
//组件内的守卫
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传入一个vue实例来获取实例的一些数据。
 beforeRouteEnter (to, from, next) {
next(vm => {
// 通过 `vm` 访问组件实例
})
}

但是注意beforeRouteUpdate和beforeRouteLeave中的next不能传入vue实例,因为这两个守卫已经可以通过this获取当前组件实例对象了。

 beforeRouteUpdate (to, from, next) {
// just use `this`
this.name = to.params.name
next()
}
//
beforeRouteLeave (to, from , next) {
const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
if (answer) {
next()
} else {
next(false)
}
}

二、路由元信息

从上一节的路由守卫的业务逻辑来看,必然会引出一个思考,就是怎么缓存路由访问权限,要不然每一次都需要进行权限验证,如果验证需要访问服务器的话,这样岂不是要消耗大量不必要的服务器资源,所以路由元信息就可以帮助我们来解决这个问题:

在定义路由的时候可以在路由中配置mata字段:

 const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
children: [
{
path: 'bar',
component: Bar,
// a meta field
meta: { requiresAuth: true }
}
]
}
]
})

meta字段可以通过$route对象来获取,但是$route上没有这个属性,因为$route.metched[n].meta来获取,$route.metched[n]缓存的是URL节点的路由配置数据,从第一个节点开始到当前节点按照顺序匹配到metched数组元素中。

 router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
// this route requires auth, check if logged in
// if not, redirect to login page.
if (!auth.loggedIn()) {
next({
path: '/login',
query: { redirect: to.fullPath }
})
} else {
next()
}
} else {
next() // 确保一定要调用 next()
}
})

简单的获取:

 this.loginFlag = this.$route.matched[0].meta.login;

三、路由懒加载

官方手册:https://router.vuejs.org/zh/guide/advanced/lazy-loading.html

将Router引入组件模块使用路由懒加载的方式加载:

const Home = () => import('./views/Home.vue')

路由懒加载还组合了预加载模式,当进入应用时首先加载首屏需要的组件模块进行渲染,剩下的组件模块会在网络空闲的时候预加载到缓存中,当需要到某个模块时直接调取缓存中的资源。

vue进阶:vue-router之导航守卫、路由元信息、路由懒加载的更多相关文章

  1. vue router的其他属性、 值的传递 、 懒加载

    路由的router-link标签有几个其他属性: 路由可以传递值(一般用作条目的id传递,之后用这个id从axios获取页面显示的数据 第一步: 定义路由以及值的属性名称(之后在跳转路由后页面里面获取 ...

  2. Vue路由(组件)懒加载(异步)

    传统的引入方式 import test from '@/components/test' { path: '/test', name: '测试页面', component:test }, 懒加载的方式 ...

  3. vue中页面卡顿,使用懒加载

    为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题. 懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载. 常用的懒加载方式有两种:即使用vue异步组件 和 ES中的imp ...

  4. Vue总结第五天:vue-router (使用模块化(创建Vue组件)机制编程)、router-link 标签的属性、路由代码跳转、懒加载、路由嵌套(子路由)、路由传递数据、导航守卫)

    Vue总结第五天:vue-router ✿ 路由(器)目录: □  vue中路由作用 □  vue-router基本使用 □  vue-router嵌套路由 □  vue-router参数传递 □  ...

  5. vue懒加载 路由 router 的编写(resolve)

    如果用import引入的话,当项目打包时路由里的所有component都会打包在一个js中,造成进入首页时,需要加载的内容过多,时间相对比较长.当你用require这种方式引入的时候,会将你的comp ...

  6. router.beforeEach、路由元信息、导航守卫与函数式编程

    一.函数的识别: 1.router.beforeEach:主函数.高阶函数.入口函数: 2.匿名参量函数:处理跳转过程中的附加逻辑 (to, from, next) => { if (to.ma ...

  7. 路由懒加载---Vue Router

    一.什么是懒加载? 懒加载也就是延迟加载或者按需加载,即在需要的时候进行加载. 二.为什么在Vue路由中使用懒加载? 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常 ...

  8. VueJs(12)---vue-router(导航守卫,路由元信息)

    vue-router(导航守卫,路由元信息) 之前泄露两篇有关vue-router博客: VueJs(10)---vue-router(进阶1) VueJs(11)---vue-router(进阶2) ...

  9. vue路由的懒加载

    一.懒加载 也叫延迟加载或者按需加载,即在需要的时候进行加载,   二.为什么要使用懒加载 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要 ...

随机推荐

  1. Android Dalvik、ART及APK编译过程

    0.1 先对Dalvik以及ART做简单介绍: 什么是Dalvik: Dalvik是Google公司自己设计用于Android平台的Java虚拟机.dex格式是专为Dalvik应用设计的一种压缩格式, ...

  2. POJ2513:Colored Sticks(字典树+欧拉路径+并查集)

    http://poj.org/problem?id=2513 Description You are given a bunch of wooden sticks. Each endpoint of ...

  3. 加载大图片的OOM异常

    * 原因:系统分配给应用程序的堆内存 < 图片的大小* 解决方案:缩放图片显示* OOM:OutOfMemoryError * 图片的宽高 * 宽 2400 * 高 3200 * 手机屏幕的宽高 ...

  4. PHP模板引擎Smarty内建函数section,sectionelse用法详解

    本文实例讲述了PHP模板引擎Smarty内建函数section,sectionelse用法.分享给大家供大家参考,具体如下: section 是 Smarty 模板中除了 foreach 以外的另一种 ...

  5. PCL基础

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=264 许可 建议每一个文件包含一个描述代码作者的许可,这对于用户了解使用该代 ...

  6. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-3.Vidoe相关接口完善和规范协议

    笔记 3 .Vidoe相关接口完善和规范协议     简介:完善相关接口,协议规范讲解 1.save接口保存对象             1)@RequestParam(value = "p ...

  7. Ubuntu 安装 docker,并上传到dockerhub

    一.安装Docker apt-get -y install docker.io 链接: ln -sf /usr/bin/docker.io /usr/local/bin/docker 检查docker ...

  8. three.js效果之热力图和轨迹线

    1.热力图 开始的时候,是用一个网上找的canvas画渐变热点的demo,原理就是给定顶点坐标,然后画圆,颜色使用渐变色,根据权重决定渐变的层数(红色->橙色->绿色) . 但是终究觉得这 ...

  9. Unity Shader的形式

    (1)表面着色器 表面着色器是Unity自身的一种着色器代码类型.它需要的代码量很少,Unity在背后做了很多工作,但渲染的代价比较大.但Unity在背后仍旧把表面着色器转换成对应的顶点/片元着色器. ...

  10. CentOS7怎么安装图形界面

    step1: 进入下载页,选择阿里云站点进行下载 Actual  Country 国内资源                   Nearby Countries  周边国家资源 阿里云站点:http: ...