学习 vue 中一个非常重要的领域,就是生命周期,它包含了很多的内容。每个 vue 实例在被创建的时候都要经历一系列的初始化过程,这个过程就是 vue 的生命周期。

每个 vue 实例在被创建的时候都要经过一系列的初始化过程——例如,需要把设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等,我们要把这一系列的过程称为组件的生命周期(组件从注册到销毁的整个过程)。我们有时候需要在组件生命周期的某个过程中,执行某些代码,基于此,vue 提供了生命周期钩子函数,给了用户在不同阶段添加自己的代码的机会。

但是在此之前,我们要详细的介绍下组件的生命周期,以及生命后期中每个阶段组件完成和未完成的部分。

一、组件的生命周期

放一张大家都很熟悉的官网文章中对生命周期的注释图。

从图中可以看出,vue 为生命周期提供了 8 个钩子函数,分别是:

  • beforeCreate: 创建前
  • created: 创建后
  • beforeMount: 挂载前
  • mounted: 挂载后
  • beforeUpate: 更新前
  • upated: 更新后
  • beforeDestoy: 销毁前
  • destoyed: 销毁后

1.beforeCreate

beforeCreate 在 vue 实例发生之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。

我们在上面的例子中在的 beforeCreate 钩子中调用 Vue 的 data 和 method,来看一下结果:

可以看到 Vue 中的 data 和方法都是去不到的,并且是在 wath 之前执行

2.created

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

主要应用:调用数据,调用方法,调用异步函数

console 输出的结果我们看一下

可以看到:created 钩子可以获取 Vue 的 data,调用 Vue 方法,获取原本 HTML 上的直接加载出来的 DOM,但是无法获取到通过挂载模板生成的 DOM(例如:v-for 循环遍历 Vue.list 生成 li)

3.beforeMount

在挂载开始之前被调用:相关的 render 函数(模板)首次被调用。

例如通过 v-for 生成的 html 还没有被挂载到页面上

 beforeMount: function () {
    console.log('beforeMount:',document.getElementsByTagName('li').length);
  },

console 打印出来的 beforeMount 为 1

4.mounted

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

有初始值的 DOM 渲染,例如我们的初始数据 list,渲染出来的 li,只有这里才能获取

 mounted: function () {
    console.log('mounted:',document.getElementsByTagName('li').length);
  },

结果 mounted: 3 , 可以看到到这里为止,挂载到实例上了,我们可以获取到 li 的个数了

5.beforeUpdate

数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。

当我们更改 Vue 的任何数据,都会触发该函数

 beforeUpdate: "function () {
    console.log('beforeUpdate 钩子执行.');
    console.log('beforeUpdate:'+this.message)
  },

6.updated

由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。

该钩子在服务器端渲染期间不被调用。

数据更新就会触发(vue 所有的数据只有有更新就会触发),如果想数据一遍就做统一的处理,可以用这个,如果想对不同数据的更新做不同的处理可以用 nextTick,或者是 watch 进行监听

 updated: function () {
    console.log('updated 钩子执行...');
    console.log('updated:',this.message)
  },

7.beforeDestroy

实例销毁之前调用。在这一步,实例仍然完全可用。

8.destroyed

Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

结果

可以看打到销毁 Vue 实例时会调用这两个函数