• 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. 记一个微信支付-1错误JSAPI缺少参数app|get_brand_request:Fail

    最近公司要做一个H5小游戏里边涉及到微信公众号支付,中间摸爬滚打遇到了很多坑.记录一下,留待后人看. 我们来看一下这个方法 GetJsApiParameters 怎么样,看起来像不像输出了一个JSON ...

  2. 初步理解js作用域

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. easyU之tabs选项卡

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  4. 省份-城市-区域三级联动【struts2 + ajax +非数据库版】

    package loaderman; /** * 实体,封装省份和城市 */ public class Bean { private String province;//省份 private Stri ...

  5. Sqlite轻量级数据库

     SQLite,是一款轻量型的数据库,是遵守ACID(原子性.一致性.隔离性.持久性)的关联式数据库管理系统,多用于嵌入式开发中. SQLite的数据类型:Typelessness(无类型), 可以保 ...

  6. 前端与后台可能需要使用交互的表单form,input标签

    前端与后台可能需要使用交互的表单标签 form表单和input标签 textarea文本域表单 select,option下拉列表表单 fieldset和legend组合表单 label标签 form ...

  7. Oracle CDC (Change Data Capture)更新数据捕获——Asynchronous HotLog Mode(附带简单的kettle任务实现数据同步)

    Performing Asynchronous HotLog Publishing Step 1   Source Database DBA: Set the database initializat ...

  8. powerdesigner使用遇到的一些问题

    1.数据库逆向生成er图时,连接数据库问题 由于powerdesigner版本是32位,可能就导致不兼容64位的机器,导致连接mysql失败: 解决方法:方法1.重新配置32位jdk 方法2.mysq ...

  9. Swift3.0封装 AFN 的 GET&POST网络请求

    // // PSNetWorkManage.swift // WeiBoSwift // // Created by 思 彭 on 16/9/25. // Copyright © 2016年 思 彭. ...

  10. idea-eclipse快捷键对比

      分类 功能点 Eclipse快捷键 IDEA快捷键 搜索 搜索文本 Ctrl + F Ctrl + F Ctrl + R 查找替换 Alt + P/A 逐个/全部替换 Alt + F3 查找当前选 ...