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 07 Javascript
jquery实现文字由下到上循环滚动的实例代码
Aug 09 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
js数组如何添加json数据及js数组与json的区别
Oct 27 Javascript
如何用js实现鼠标向上滚动时浮动导航
Jul 18 Javascript
Bootstrap基本布局实现方法详解
Nov 25 Javascript
jQuery仿写百度百科的目录树
Jan 03 Javascript
fullpage.js最后一屏滚动方式
Feb 06 Javascript
关于微信小程序bug记录与解决方法
Aug 15 Javascript
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
layer父页获取弹出层输入框里面的值方法
Sep 02 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
Apr 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
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
angular.element方法汇总
2015/01/07 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
python操作日期和时间的方法
2014/03/11 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
使用K.function()调试keras操作
2020/06/17 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
智能旅行箱:Horizn Studios
2018/04/30 全球购物
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
不错的求职信范文
2014/07/20 职场文书
会计岗位职责
2015/02/03 职场文书
运动会班级前导词
2015/07/20 职场文书
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技