vue生命周期的探索


Posted in Javascript onApril 03, 2019

那么进入某个路由对应的组件的时候,我们会触发哪些类型的周期呢?

  1. 根实例的加载相关的生命周期(beforeCreate、created、beforeMount、mounted)
  2. 组件实例的加载相关的生命周期(beforeCreate、created、beforeMount、mounted)
  3. 全局路由勾子(router.beforeEach)
  4. 组件路由勾子(beforeRouteEnter)
  5. 组件路由勾子的next里的回调(beforeRouteEnter)
  6. 指令的周期(bind,inserted)
  7. nextTick方法的回调

接下来,让我们用vue-cli简单改造后的项目,做一个测试,看看各个声明周期的触发顺序是怎样的

main.js:

router.beforeEach((to, from, next) => {
 console.log('路由全局勾子:beforeEach')
 next()
})
 
router.afterEach((to, from) => {
 console.log('路由全局勾子:afterEach')
})
 
new Vue({
 beforeCreate () {
  console.log('根组件:beforeCreate')
 },
 created () {
  console.log('根组件:created')
 },
 beforeMount () {
  console.log('根组件:beforeMount')
 },
 mounted () {
  console.log('根组件:mounted')
 }
 el: '#app',
 router,
 template: '<App/>',
 components: { App }
})

test.vue

<template>
 <h1 v-ooo @click = "$router.push('/')">test</h1>
</template>
<script>
export default {
 beforeRouteEnter (to, from, next) {
  console.log('组件路由勾子:beforeRouteEnter')
  next(vm => {
   console.log('组件路由勾子beforeRouteEnter的next')
  })
 },
 beforeCreate () {
  console.log('组件:beforeCreate')
 },
 created () {
  this.$nextTick(() => {
   console.log('nextTick')
  })
  console.log('组件:created')
 },
 beforeMount () {
  console.log('组件:beforeMount')
 },
 mounted () {
  console.log('组件:mounted')
 },
 directives: {
  ooo: {
   bind (el, binding, vnode) {
    console.log('指令binding')
   },
   inserted (el, binding, vnode) {
    console.log('指令inserted')
   }
  }
 }
}
</script>

接下来,直接进入test.vue对应的路由。在控制台,我们看到如下的输出

vue生命周期的探索

我们看到执行的顺序为

  1. 路由勾子 (beforeEach、beforeRouteEnter、afterEach)
  2. 根组件 (beforeCreate、created、beforeMount)
  3. 组件 (beforeCreate、created、beforeMount)
  4. 指令 (bind、inserted)
  5. 组件 mounted
  6. 根组件 mounted
  7. beforeRouteEnter的next的回调
  8. nextTick

结论

路由勾子执行周期非常早,甚至在根实例的渲染之前

具体的顺序 router.beforeEach > beforeRouteEnter > router.afterEach

tip:在进行路由拦截的时候要避免使用实例内部的方法或属性。
在开发项目时候,我们脑门一拍把,具体拦截的程序,写在了根实例的方法上了,到beforeEach去调用。
结果导致整个拦截的周期,推迟到实例渲染的之后。
因此对于一些路由组件的beforeRouteEnter里的请求并无法拦截,页面看上去好像已经拦截下来了。
实际上请求依然发了出去,beforeRouteEnter内的函数依然执行了。

指令的绑定在组件mounted之前,组件的beforeMount之后
不得不提的, beforeRouteEnter的next勾子

beforeRouteEnter的执行顺序是如此靠前,而其中next的回调勾子的函数,执行则非常靠后,在mounted之后!!
我们通常是在beforeRouteEnter中加载一些首屏用数据,待数据收到后,再调用next勾子,通过回调的参数vm将数据绑定到实例上。
因此,请注意next的勾子是非常靠后的。

nextTick
越早注册的nextTick触发越早

以上所述是小编给大家介绍的vue生命周期的探索详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript常考语句107条收集
Mar 09 Javascript
javascript instanceof 内部机制探析
Oct 15 Javascript
javascript SpiderMonkey中的函数序列化如何进行
Dec 05 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
Mar 04 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
Dec 03 Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
jQuery EasyUI Layout实现tabs标签的实例
Sep 26 jQuery
Vue注册组件命名时不能用大写的原因浅析
Apr 25 Javascript
微信小程序实现卡片左右滑动效果的示例代码
May 01 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
Jun 06 jQuery
原生JavaScript实现拖动校验功能
Sep 29 Javascript
微信小程序 根据不同用户切换不同TabBar
Apr 21 Javascript
用原生 JS 实现 innerHTML 功能实例详解
Apr 03 #Javascript
详释JavaScript执行环境与执行栈
Apr 02 #Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
Apr 02 #Javascript
koa大型web项目中使用路由装饰器的方法示例
Apr 02 #Javascript
vue中v-text / v-html使用实例代码详解
Apr 02 #Javascript
Seajs源码详解分析
Apr 02 #Javascript
使用mixins实现elementUI表单全局验证的解决方法
Apr 02 #Javascript
You might like
PHP4之COOKIE支持详解
2006/10/09 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
js 学习笔记(三)
2009/12/29 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
浅谈Python的文件类型
2016/05/30 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
幼儿园教师个人反思
2014/01/30 职场文书
倡议书范文格式
2014/05/12 职场文书
本科生自荐信
2014/06/18 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
JavaScript中MutationObServer监听DOM元素详情
2021/11/27 Javascript
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js