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 07 Javascript
兼容主流浏览器的iframe自适应高度js脚本
Jan 10 Javascript
谈谈JavaScript类型系统之Math
Jan 06 Javascript
JavaScript的事件机制详解
Jan 17 Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 Javascript
JavaScript实现封闭区域布尔运算的示例代码
Jun 25 Javascript
详解Koa中更方便简单发送响应的方式
Jul 20 Javascript
js数据类型检测总结
Aug 05 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
Oct 23 Javascript
微信小程序实现原生步骤条
Jul 25 Javascript
JS中async/await实现异步调用的方法
Aug 28 Javascript
详解JavaScript原型与原型链
Nov 16 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基于XMLWriter操作xml的方法分析
2017/07/17 PHP
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
JS图片轮播与索引变色功能实例详解
2017/07/06 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
Python实现简单的语音识别系统
2017/12/13 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
python类的实例化问题解决
2019/08/31 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
美国高街时尚品牌:OASAP
2016/07/24 全球购物
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
法学院方阵解说词
2014/01/29 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
党代会心得体会
2014/09/04 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS
戴尔Win11系统no bootable devices found解决教程
2022/09/23 数码科技