Vue是一个构造函数;当执行这个构造函数时,数据监听、编译模板,实例挂载真实的DOM,数据更新DOM更新;在这个过程中,会默认调用一些函数执行,这些函数就是vue生命周期的钩子函数;
在实例生成以及后期的数据中,有8个
钩子函数
;
beforeCreate
:在这个钩子函数之前初始化一些事件和vue的生命周期;
1).不能获取vue中data的数据;
2). 如:document.getElementsByTagName;不能操作DOM;
created
:可以获取data中的数据;但是不能操作DOM; 一般用于获取数据;
beforeMount
:挂载之前,在这个钩子函数之前,判断是否有el,是否有template;
mounted
:挂载之后;把vue实例生成虚拟的DOM挂载真实的DOM上; 可以获取最终的DOM元素;
beforeUpdate
:数据更新之前,虚拟DOM通过DOM-diff算法进行对比,并且重新渲染和打补丁;
updated
:数据更新完成
beforeDestroy
:销毁之前
destroyed
:销毁之后: 销毁观察者、子组件、事件的监听者;
created
和beforeMount
在挂载真实的DOM之前执行,可以用来更改数据,减少性能的开销
在vue实例生成过程中,先执行前四个钩子函数(
beforeCreate
、created
、beforeMount
、mounted
),在销毁的时候执行后两个函数(beforeDestroy
、destroyed
),有数据更新执行更新函数(beforeUpdate
、updated
)
话不多说,先放图
Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、销毁等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。
每一个组件或者实例都会经历一个完整的生命周期,总共分为三个阶段:
初始化、运行中、销毁。
(1)、实例、组件通过new Vue() 创建出来之后会初始化事件和生命周期,然后就会执行beforeCreate钩子函数,这个时候,数据还没有挂载呢,只是一个空壳,无法访问到数据和真实的dom,一般不做操作
(2)、挂载数据,绑定事件等等,然后执行created函数,这个时候已经可以使用到数据,也可以更改数据,在这里更改数据不会触发updated函数,在这里可以在渲染前倒数第二次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取
(3)、接下来开始找实例或者组件对应的模板,编译模板为虚拟dom放入到render函数中准备渲染,然后执行beforeMount钩子函数,在这个函数中虚拟dom已经创建完成,马上就要渲染,在这里也可以更改数据,不会触发updated,在这里可以在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取
(4)、接下来开始render,渲染出真实dom,然后执行mounted钩子函数,此时,组件已经出现在页面中,数据、真实dom都已经处理好了,事件都已经挂载好了,可以在这里操作真实dom等事情…
(5)、当组件或实例的数据更改之后,会立即执行beforeUpdate,然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染,一般不做什么事儿
(6)、当更新完成后,执行updated,数据已经更改完成,dom也重新render完成,可以操作更新后的虚拟dom
(7)、当经过某种途径调用$destroy方法后,立即执行beforeDestroy,一般在这里做一些善后工作,例如清除计时器、清除非指令绑定的事件等等
(8)、组件的数据绑定、监听…去掉后只剩下dom空壳,这个时候,执行destroyed,在这里做善后工作也可以