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作者John Resig自己封装的javascript 常用函数
Nov 09 Javascript
ajax请求get与post的区别总结
Nov 04 Javascript
js 3秒后跳转页面的实现代码
Mar 10 Javascript
js中的getAttribute方法使用示例
Aug 01 Javascript
javascript实现input file上传图片预览效果
Dec 31 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
Nov 30 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
Dec 20 Javascript
详解创建自定义的Angular Schematics
Jun 06 Javascript
Vue.directive使用注意(小结)
Aug 31 Javascript
JavaScript 截取字符串代码实例
Sep 05 Javascript
extjs4图表绘制之折线图实现方法分析
Mar 06 Javascript
如何在面试中手写出javascript节流和防抖函数
Oct 22 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
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
javascript 计算两个整数的百分比值
2009/12/26 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
json的使用小结
2016/06/08 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
python实现计算资源图标crc值的方法
2014/10/05 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
python安装twisted的问题解析
2018/08/21 Python
基于python生成器封装的协程类
2019/03/20 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
python写一个随机点名软件的实例
2019/11/28 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
外企财务年会演讲稿
2014/01/03 职场文书
交通安全演讲稿
2014/01/07 职场文书
会计专业求职信范文
2015/03/19 职场文书
员工加薪申请报告
2015/05/15 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS
python用tkinter开发的扫雷游戏
2021/06/01 Python
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
mysql insert 存在即不插入语法说明
2022/03/25 MySQL
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers