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 学习技巧
Feb 17 Javascript
JQuery Ajax 跨域访问的解决方案
Mar 12 Javascript
js中浮点型运算BUG的解决方法说明
Jan 06 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
Jan 07 Javascript
封装好的一个万能检测表单的方法
Jan 21 Javascript
微信小程序 http请求详细介绍
Oct 09 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
Apr 12 Javascript
ReactJs设置css样式的方法
Jun 08 Javascript
JavaScript实现简单评论功能
Aug 17 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
Feb 09 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
Apr 08 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
Dec 02 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的正则处理函数总结分析
2008/06/20 PHP
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
javascript 自定义事件初探
2009/08/21 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
使用js实现数据格式化
2014/12/03 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
Python中非常实用的一些功能和函数分享
2015/02/14 Python
Python中特殊函数集锦
2015/07/27 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
开展创先争优活动总结
2014/08/28 职场文书
老公保证书
2015/01/17 职场文书
表扬稿范文
2015/01/17 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL