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 当前日期转化为中文的实现代码
May 13 Javascript
用Mootools获得操作索引的两种方法分享
Dec 12 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
Jan 13 Javascript
chrome下img加载对height()的影响示例探讨
May 26 Javascript
jquery及js实现动态加载js文件的方法
Jan 21 Javascript
JS制作图形验证码实现代码
Oct 19 Javascript
ES6中参数的默认值语法介绍
May 03 Javascript
knockoutjs模板实现树形结构列表
Jul 31 Javascript
浅谈Vue-cli 命令行工具分析
Nov 22 Javascript
移动端手指操控左右滑动的菜单
Sep 08 Javascript
vue使用swiper.js重叠轮播组建样式
Nov 14 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
用原生 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/07/19 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
javascript 一些用法小结
2009/09/11 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
jQuery实现统计复选框选中数量
2014/11/24 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
js中的闭包学习心得
2018/02/06 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
Python数组条件过滤filter函数使用示例
2014/07/22 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Python字节单位转换实例
2019/12/05 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
python 实现aes256加密
2020/11/27 Python
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
护士自荐信
2013/10/25 职场文书
工作鉴定评语
2014/05/04 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python