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 相关文章推荐
jQuery实现图片放大预览实现原理及代码
Sep 12 Javascript
通过js简单实现将一个文本内容转译成加密文本
Oct 22 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
Sep 01 Javascript
理解javascript异步编程
Jan 27 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
bootstrap fileinput插件实现预览上传照片功能
Jan 23 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
简化vuex的状态管理方案的方法
Jun 02 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
Nov 02 Javascript
一个因@click.stop引发的bug的解决
Jan 08 Javascript
javascript读取本地文件和目录方法详解
Aug 06 Javascript
Vue 样式切换及三元判断样式关联操作
Aug 09 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
PHP中执行cmd命令的方法
2014/10/11 PHP
PHP加密解密实例分析
2015/12/25 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python中DJANGO简单测试实例
2015/05/11 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python实现淘宝秒杀脚本
2020/06/23 Python
python 字符串追加实例
2019/07/20 Python
python实现日志按天分割
2019/07/22 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
Django 批量插入数据的实现方法
2020/01/12 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
机械制造专业毕业生求职信
2014/03/02 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
法院答辩状格式
2015/05/22 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
校园安全学习心得体会
2016/01/18 职场文书
团组织关系介绍信
2019/06/24 职场文书