正如其名,vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消。

  有多种方式可以在路由导航发生时执行钩子:全局的、单个路由独享的、或者组件级的。

一、全局钩子

  你可以使用 router.beforeEach 注册一个全局的 before 钩子:

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

  同样可以注册一个全局的 after 钩子,不过它不像 before 钩子那样,after 钩子没有 next 方法,不能改变导航

router.afterEach(route => { // ...})

二、某个路由独享的钩子

  你可以在路由配置上直接定义 beforeEnter 钩子:

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

  这些钩子与全局 before 钩子的方法参数是一样的

三、组件内的钩子

  最后,你可以在路由组件内直接定义以下路由导航钩子:

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来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。

beforeRouteEnter (to, from, next) {next(vm => {// 通过 `vm` 访问组件实例
  })
}

  你可以 在 beforeRouteLeave 中直接访问 this。这个 leave 钩子通常用来禁止用户在还未保存修改前突然离开。可以通过 next(false) 来取消导航。

  同时注意必须有这个next(),相当于一个按钮开启一样。

1、beforeRouteEnter(to,from,next)

beforeRouteEnter 函数内部 this 是undefined,这是因为在执行路由钩子函数beforRouteEnter时候,组件还没有被创建出来;先执行beforRouteEnter,再执行组件周期钩子函数beforeCreate。我们可以通过 next 获取组件的实例对象,如:next( (vm)=>{} ),参数vm就是组件的实例化对象。

2、beforeRouteUpdate(to,from,next)

About组件是有二级导航的,在切换二级导航的时候,对应的内容是在变化的;但是about组件是复用的,只会生成一次,切换二级导航的时,如何知道导航在更新呢?

一个组件有二级导航的时候,点击二级导航的时候导航路径更新了,会触发路由钩子函数beforeRouteUpdate。

3、beforeRouteLeave(to,from,next)

当在about切换到user时,about页面有些数据还没有加载完成,这时候我们不让它切换到user。

<template><div>我是about<hr><ul class="subnave f-cb"><!-- a标签中href属性不需要写地址,页面编译完成后自动会在href中加入对应的路劲 --><router-link :to='{name:"About"}' exact tag="li"><a>study</a></router-link><router-link :to='{name:"Work"}' tag="li"><a>work</a></router-link><router-link :to='{name:"Hobby"}' tag="li"><a>hobby</a></router-link></ul>测试数据:{{test}}<router-view></router-view></div>
</template><script>export default {data(){return {test:'改变之前'}},beforeCreate(){//组件生命周期函数console.log('beforeCreate')},//当进入组件之前,执行 beforRouteEnter 路由钩子函数beforeRouteEnter(to,from,next){console.log('beforRouteEnter')console.log(this) // 结果为undefined,因为在执行beforRouteEnter时候,组件还没有被创建出来;先执行beforRouteEnter,再执行beforeCreatenext((vm)=>{ //参数vm就是当前组件的实例。vm.test = '我被改变了'})},beforeRouteUpdate(to,from,next){console.log('beforeRouteUpdate')next()},beforeRouteLeave(to,from,next){//离开组件的时候触发//什么都不写的时候,不会离开(走下一步)
            next()}}
</script>

四、路由钩子在实际开发中的应用场景

  路由钩子在实际的开发过程中使用较少, 我在实际的项目中只在组件内使用过beforeRouteLeave, 使用场景分别为一下三类情况:

1、清除当前组件中的定时器

  当一个组件中有一个定时器时, 在路由进行切换的时候, 可使用beforeRouteLeave将定时器进行清楚, 以免占用内存:

beforeRouteLeave (to, from, next) {window.clearInterval(this.timer) //清除定时器
 next()
}

2、当页面中有未关闭的窗口, 或未保存的内容时, 阻止页面跳转

  如果页面内有重要的信息需要用户保存后才能进行跳转, 或者有弹出框的情况. 应该阻止用户跳转

beforeRouteLeave (to, from, next) {//判断是否弹出框的状态和保存信息与否if (this.dialogVisibility === true) {this.dialogVisibility = false //关闭弹出框next(false) //回到当前页面, 阻止页面跳转}else if(this.saveMessage === false) {//弹出警告next(false) //回到当前页面, 阻止页面跳转}else {next() //否则允许跳转
 }
}

3、保存相关内容到Vuex中或Session中

  当用户需要关闭页面时, 可以将公用的信息保存到session或Vuex中

beforeRouteLeave (to, from, next) {localStorage.setItem(name, content); //保存到localStorage中
  next()
}

vue组件级路由钩子函数介绍,及实际应用相关推荐

  1. before vue路由钩子_vue组件级路由钩子函数介绍,及实际应用

    正如其名,vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消. 有多种方式可以在路由导航发生时执行钩子:全局的.单个路由独享的.或者组件级的. 一.全局钩子 你可以使用 rout ...

  2. Vue的生命周期钩子函数介绍

    感谢内容提供者:金牛区吴迪软件开发工作室 Vue的生命周期钩子函数介绍 vue生命周期共分为四个阶段 一:实例创建 二:DOM渲染 三:数据更新 四:销毁实例 共有八个基本钩子函数 1.beforeC ...

  3. vue 组件中的钩子函数 不能直接写this

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

  4. Vue 路由钩子函数

    路由钩子函数分为三种: 全局前置守卫 router.beforeEach全局解析守卫 router.beforeResolve全局后置钩子 router.afterEach路由独享的守卫 before ...

  5. “约见”面试官系列之常见面试题之第七十六篇之vue-router中的路由钩子函数基本用法 (建议收藏)

    vue-router中的路由钩子函数基本用法 路由钩子函数分为三种类型如下: 第一种:全局钩子函数. router.beforeEach((to, from, next) => { consol ...

  6. 不来看看这些 VUE 的生命周期钩子函数? | 原力计划

    作者 | huangfuyk 责编 | 王晓曼 出品 | CSDN 博客 VUE的生命周期钩子函数:就是指在一个组件从创建到销毁的过程自动执行的函数,包含组件的变化.可以分为:创建.挂载.更新.销毁四 ...

  7. Vue的生命周期钩子函数

    Vue的生命周期钩子函数 一.Vue的生命周期共分为四个阶段 1.创建实例 2.DOM渲染 3.数据更新 4.销毁实例 二.共有八个基本钩子函数 1.beforeCreate -创建前 触发的行为:V ...

  8. 实战 Vue 之生命周期钩子函数执行顺序

    实战 Vue 之生命周期钩子函数执行顺序 生命周期钩子函数 父组件与子组件执行顺序 生命周期钩子函数 beforeCreate:实例刚被创建出来,data 数据和 methods 方法还未被初始化,不 ...

  9. vue的生命周期钩子函数的作用

    之前在大学学习Java的时候 笔试题的第一道题经常是你是怎么理解生命周期的 在vue的生命周期却又与Java不同的 一个java类的完整的生命周期会经历加载.连接.初始化.使用.和卸载五个阶段: 而v ...

最新文章

  1. 双脑协同RSVP目标检测
  2. 微信从原版到现在所有界面图片_微信突然宣布:现在能改微信号了,所有人都能改...
  3. 使用visualvm远程监控LINUX服务器JVM
  4. 混编ObjectiveC++
  5. 持续集成部署Jenkins工作笔记0015---编辑SVN钩子程序
  6. twisted学习资料
  7. [NPOI2.0] 使用NPOI读取和导出Excel文件
  8. iOS 审核之 Performance - 2.5.2 被拒 dlopen(), dlsym(), respondsToSelector:, performSelector
  9. iOS The run destination iPhone is not valid for Running the scheme ‘项目名‘
  10. Python--29 魔法方法:定制序列
  11. MySQL的Grant命令[转]
  12. python保存到txt_python保存成文本文件
  13. 离散数学 (II) 习题 7
  14. Mac终端打开VsCode
  15. 机电学生写给十年后自己的一封信
  16. 人生的意义是通过努力活得更好
  17. 《Python基础教程》第2章读书笔记(1)
  18. 将图片和文字写到pdf文件中
  19. 2021 Java面试题总结(更新中)
  20. 笔记本电脑免拆清灰的诸多方法,怎么不拆机清灰

热门文章

  1. Java学习3之成员方法及函数重载
  2. ASP.NET 系统对象 Request(一)
  3. jQuery 使用 jQuery UI 部件工厂编写带状态的插件(翻译)
  4. 快速清空mysql表的方法
  5. 使用ASP.NET Abstractions增强ASP.NET应用程序的可测试性
  6. 静态程序分析chapter2 - IR(Jimple) 和 CFG
  7. redis 服务器/客户端安装与配置
  8. C# Settings使用小结
  9. VMware View 5.2 安装实施七 安装Web Client
  10. 在Eclipse中生成API方法