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 相关文章推荐
JS判断是否为数字,是否为整数,是否为浮点数的代码
Apr 24 Javascript
Jquery 绑定时间实现代码
May 03 Javascript
javascript如何动态加载表格与动态添加表格行
Nov 27 Javascript
JS判断对象是否存在的10种方法总结
Dec 23 Javascript
js实现二代身份证号码验证详解
Nov 20 Javascript
分享10个原生JavaScript技巧
Apr 20 Javascript
基于Css3和JQuery实现打字机效果
Aug 11 Javascript
利用Jquery队列实现根据输入数量显示的动画
Sep 01 Javascript
使用angular帮你实现拖拽的示例
Jul 05 Javascript
vue实现多组关键词对应高亮显示功能
Jul 25 Javascript
Vue微信公众号网页分享的示例代码
May 28 Javascript
three.js欧拉角和四元数的使用方法
Jul 26 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
JavaScript 中的日期和时间及表示标准介绍
2013/08/21 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
利用python修改json文件的value方法
2018/12/31 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
如何让python的运行速度得到提升
2020/07/08 Python
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
小学生家长评语大全
2014/02/10 职场文书
关于环保的建议书400字
2014/03/12 职场文书
机关搬迁方案
2014/05/18 职场文书
学校工作推荐信范文
2014/07/11 职场文书
车辆年检委托书范本
2014/10/14 职场文书
合作意向书范本
2019/04/17 职场文书
工厂无线对讲系统解决方案
2022/02/18 无线电