前言
Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。
Vue生命周期图解
Vue2.x中的生命周期
生命周期钩子 | 描述 |
---|---|
beforeCreate | 组件实例刚被创建,组件属性计算之前,如data属性等 官网解释:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 |
created | 组件实例创建完成,属性已绑定,但DOM还未生成,$el 属性还不存在官网解释:在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始, $el 属性目前不可见。 |
beforeMount | 模板编译/挂载之前 官网解释:在挂载开始之前被调用:相关的 render 函数首次被调用。 该钩子在服务器端渲染期间不被调用。 |
mounted | 模板编译/挂载之后 官网解释: el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。 该钩子在服务器端渲染期间不被调用。 |
beforeUpdate | 组件更新之前 官网解释:数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。 该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行。 |
updated | 组件更新之后 官网解释:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。 该钩子在服务器端渲染期间不被调用。 |
activated | keep-alive 组件激活时调用。 该钩子在服务器端渲染期间不被调用。 |
deactivated | keep-alive 组件停用时调用。 该钩子在服务器端渲染期间不被调用。 |
beforeDestroy | 组件销毁前调用 官网解释:在这一步,实例仍然完全可用。 该钩子在服务器端渲染期间不被调用。 |
destroyed | 组件销毁后调用 官网解释:调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。 该钩子在服务器端渲染期间不被调用。 |
errorCaptured | 2.5.0+ 新增。当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。 |
代码实例
1 | <body> |
打印结果如图
- 第一个黄框内的内容,此时created,
this.$refs.test
为undefined
,获取Dom节点报错,说明此时dom没有生成,挂载还没开始,beforeMount同理。 - 红框时为mounted,此时页面打印结果可以看到
this.$refs.test
已经有值,Dom内的hello world也正常打印出来,说明此时Dom以生成,挂载已完成。 - 改变test的值,beforeUpdate时,
this.$refs.test
已经改变,Dom节点内的hello world并未改变。说明beforeUpdate发生在虚拟 DOM 重新渲染之前,实例的更新发生在Dom重新渲染之前。updated时,this.$refs.test
保持更新后的值,Dom节点内的hello world更新为hi。说明updated发生在虚拟 DOM 重新渲染之后。 - 调用
vm.$destroy()
,beforeDestroy时,this.$refs.test
值依旧存在,说明在这一步,实例仍然完全可用。destroyed时,this.$refs.test
值为undefined
,说明此时实例已经被完全销毁。
created与mounted
created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。
mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。