梳理一下vue中的生命周期


Posted in Vue.js onDecember 30, 2020

什么是生命周期?

生命周期,以个人之浅见,即一个事物从诞生到消亡的一个过程!

以人的一生来做类比,其实就可以简单粗暴的将生命周期看作人的一生,人这一出生就开始了一段美好(艰难)的旅程,一生中每个成长的阶段都会对应的去做每个阶段该做的事,比如,上幼儿园,小学,中学,高中,大学,工作(比如我就在辛苦的码字),结婚等等直到百年以后,尘归尘,土归土,这就是人的生命周期!

vue也有这样的一个生命周期,也会在执行到每个阶段做一些事情,不同的是vue在每个对应的阶段是通过生命周期函数去做的,此刻再去看一下vue官网对生命周期的描述就好理解多了!

vue官网的描述:

每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

简单来说就是: 在 Vue 从创建实例到最终完全消亡的过程中,会执行一系列的方法,用于对应当前 Vue 的状态,这些方法我们叫它:生命周期钩子!

来看我给大家找的一张图,可以保存起来,等待后学学习使用的深入,再看这张图:

梳理一下vue中的生命周期

根据上图可知,vue的生命周期一共有8个钩子函数,这8个函数描绘了一个vue的一生,下来我们详细来看看这8个生命周期函数,以便更好的理解Vue的生命周期!

vue的8个生命周期函数

配合上图观看

1.beforeCreate:在实例初始化之后,数据观测 (Data Observer) 和 event/watcher 事件配置之前被调用。

2.created:在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer)、属性和方法的运算,watch/event 事件回调;然而,挂载阶段还没开始,$el 属性目前不可见。

3.beforeMount:在挂载开始之前被调用,相关的 render 函数首次被调用。

4.mounted:el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。

如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内(PS:注意 mounted 不会承诺所有的子组件也都一起被挂载。

如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 替换掉 mounted:, vm.$nextTick会在后面的篇幅详细讲解,这里大家需要知道有这个东西。

5.beforeUpdate:数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
6.updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。当这个钩子被调用时,组件 DOM 已经更新,所以现在可以执行依赖于 DOM 的操作,然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之(PS:计算属性与 watcher 会在后面的篇幅中进行介绍)。
7.beforeDestroy:实例销毁之前调用,在这一步,实例仍然完全可用。
8.destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

代码验证:

下面的例子我故意将生命周期钩子函数的顺序打乱,并编号,但它还是会自动按照执行顺序输出,就可以验证其上图中的流程,你也手动试试吧!

<div id="app">
 <button @click="clickCounter()">点击</button>
 <p>{{ count }}</p>
</div>
 
 <script type="text/javascript">
  var app = new Vue({
  el: '#app',
  data:{
   count: 1
  },
  methods:{
   clickCounter(){
   this.count += 1
   }
  },
  created: function(){
   console.log('2. 实例已经创建')
  },
  beforeCreate: function(){
   console.log('1. 实例初始化')
  },
  mounted:function(){
   console.log('4. 挂载到实例')
  },
  beforeMount:function(){
   console.log('3. 挂载开始之前')
  },
  beforeUpdate: () => {
   console.log('数据更新时调用')
  },
  updated:function(){
   console.log('更新数据重新渲染DOM')
  },
  beforeDestroy:function(){
   console.log('实例销毁之前调用')
  },
  destroyed:function(){
   console.log('实例销毁之后调用')
  }
  })
  
  /*点击页面销毁vue对象, 销毁之后实例将会释放*/
  // 销毁之后,再次点击就不起作用了
  document.onclick=function(){
   app.$destroy();
  };
 </script>

注意: 最后我手动将这个实例销毁了,点击之后执行一次,后边再点击就不起作用了,测试的时候先把销毁代码端注释掉,然后再放开,进行测试!

3个关于vue组件的生命周期钩子

  1. activated:keep-alive 组件激活时调用(PS:与组件相关,关于 keep-alive 会在讲解组件时介绍)。
  2. deactivated:keep-alive 组件停用时调用(PS:与组件相关,关于 keep-alive 会在讲解组件时介绍)。
  3. errorCaptured :当捕获一个来自子孙组件的错误时被调用,此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串,此钩子可以返回 false 以阻止该错误继续向上传播。

写在最后

生命周期这块知识点,在这一块我们只需要有所了解,对其大概使用有个基本的掌握,等待学习的深入以及理解的深入,在回过头来看着一块的内容,结合Vue的源码去看会收获良多!

以上就是梳理一下vue中的生命周期的详细内容,更多关于vue 生命周期的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
Vue实现简易购物车页面
Dec 30 Vue.js
vuex的使用步骤
Jan 06 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
vue+element table表格实现动态列筛选的示例代码
Jan 14 Vue.js
Vue实现图书管理案例
Jan 20 Vue.js
Vue 3自定义指令开发的相关总结
Jan 29 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
vue3如何优雅的实现移动端登录注册模块
Mar 29 Vue.js
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
vue3不同环境下实现配置代理
May 25 Vue.js
Vue实现简易购物车页面
Dec 30 #Vue.js
利用Vue实现简易播放器的完整代码
Dec 30 #Vue.js
vue+element UI实现树形表格
Dec 29 #Vue.js
vue实现树状表格效果
Dec 29 #Vue.js
vue实现图书管理系统
Dec 29 #Vue.js
Vue实现随机验证码功能
Dec 29 #Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 #Vue.js
You might like
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
使用python动态生成波形曲线的实现
2019/12/04 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
类的核心特性有哪些
2014/01/01 面试题
打架检讨书800字
2014/01/10 职场文书
大学专科自荐信
2014/06/17 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
整改报告怎么写
2014/11/06 职场文书
2014年民政工作总结
2014/11/26 职场文书
2015年工程部工作总结
2015/04/30 职场文书
雷锋的故事观后感
2015/06/10 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android