• 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. 2.jdk1.8+springboot中http1.1之tcp连接复用实现

    接上篇:https://www.cnblogs.com/Hleaves/p/11284316.html 环境:jdk1.8 + springboot 2.1.1.RELEASE + feign-hys ...

  2. curl获取远程页面

    // 创建一个新cURL资源$ch = curl_init(); // 设置URL和相应的选项$options = array(CURLOPT_URL => 'http://www.w3csch ...

  3. 如何写resultful接口

    一.协议 API与客户端用户的通信协议,总是使用HTTPS协议,以确保交互数据的传输安全. 二.域名 应该尽量将API部署在专用域名之下: https://api.example.com 如果确定AP ...

  4. Spring Cloud(0):目录

    Spring Cloud(1):概览 Spring Cloud(2):服务发现(Eureka) Spring Cloud(3):配置服务(Config) Spring Cloud(4):断路器(Hys ...

  5. 【JVM学习笔记】字节码文件结构实例

    上一篇笔记的内容大部分没有实际动手操作,因此决定完成这个完整的练习并记录下来. 另注,idea环境下有jclasslib插件用于更好的查看类似于javap结果的内容. 源代码如下: package c ...

  6. VueRouter爬坑第三篇-嵌套路由

    VueRouter系列的文章示例编写时,项目是使用vue-cli脚手架搭建. 项目搭建的步骤和项目目录专门写了一篇文章:点击这里进行传送 后续VueRouter系列的文章的示例编写均基于该项目环境. ...

  7. Java 基础篇之泛型

    背景 在没有泛型前,一旦把一个对象丢进集合中,集合就会忘记对象的类型,把所有的对象都当成 Object 类型处理.当程序从集合中取出对象后,就需要进行强制类型转换,这种转换很容易引起 ClassCas ...

  8. jQuery 相关插件

    jQuery 是一个快速的,简洁的 javaScript 库,使用户能更方便地处理 HTML documents.events.实现动画效果,并且方便地为网站提供 AJAX 交互. jQuery 还有 ...

  9. Mac 每次重启终端后配置的不生效.需要重新source

    Mac 每次都要执行source ~/.bash_profile 配置的环境变量才生效 自己在 ~/.bash_profile 中配置环境变量, 可是每次重启终端后配置的不生效.需要重新执行 : $s ...

  10. Linux-android 模拟器使用

    1.把sdcard挂载到一个文件夹 mkdir sdcard sudo mount -o loop sdcard.img sdcard 日志在sdcard下lm-kill文件下查看 注解: http: ...