• 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. React Native 常用第三方组件

    React-Native-Elements 一组开发RN的UI工具包(强烈推荐)

  2. 解决docker命令行终端显示不全的问题

    访问docker容器,vim编辑文件时总是无法展示文件内容 解决 sudo docker exec -it -e LINES=$(tput lines) -e COLUMNS=$(tput cols) ...

  3. 一百零五:CMS系统之flask-mail使用和邮箱配置、发送邮件功能

    安装:pip install flask-mail 官方文档:https://pythonhosted.org/Flask-Mail/ 邮箱配置 MAIL_SERVER = 'smtp.qq.com' ...

  4. centos6.8(虚拟机VNC)输入正确用户名和密码仍跳回登录界面

    1)CentOS自动更新到6.8后root无法登陆问题解决 虚拟机CentOS服务器不知道被谁更新系统到6.8后,发现在本机上即使输入正确的密码也无法登陆,发现有一些人也碰见过同样的问题,但是他们是因 ...

  5. bert系列二:《BERT》论文解读

    论文<BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding> 以下陆续介绍ber ...

  6. 酷Q插件_SDK———入门与使用

    1.这里使用的是易语言的SDK,所以请看不惯的人自行离开.{wymbf.} 1.2 这里不会直接给你工程,请用动手打代码,动脑思考. 1.3 不知道.不了解酷Q是干嘛的,请访问:https://cqp ...

  7. 二、Linux用户身份

    0.介绍: 管理员UID为0:系统的管理员用户. 系统用户UID为1-999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控 ...

  8. centos7清楚journal日志

    1.只保留1天的日志 journalctl --vacuum-time=1d 参考:https://blog.csdn.net/ithomer/article/details/90634579

  9. ZOJ Problem Set - 1002

    参考: 1.http://www.cnblogs.com/phinecos/archive/2008/09/18/1293017.html 基本思想:回溯法 重点在void Solve(int k,i ...

  10. Linux下kafka集群搭建过程记录

    环境准备 zookeeper集群环境kafka是依赖于zookeeper注册中心的一款分布式消息对列,所以需要有zookeeper单机或者集群环境. 三台服务器: 172.16.18.198 k8s- ...