简单易懂vue组件的生命周期,附带面试题中的vue周期相关题目(百分之八十的几率要问)
一、vue生命周期是什么?
beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed二、使用步骤
1.整体
2.beforeCreate
在实例初始化之后,数据观测和事件配置之前被调用,此时组件的选项对象还未创建,el 和 data 并未初始化,因此无法访问methods, data, computed等上的方法和数据。
代码如下(示例):
beforecreate() {
}
在这个阶段是创建前的状态,初始化事件和生命周期。可以加载一些比如 loading加载动画,在页面渲染前出现的内容
这个阶段几乎没有操作,获取不到data数据,没有$el,已经有了this
3.created
实例已经创建完成之后被调用,在这一步,实例已完成以下配置:数据观测、属性和方法的运算,watch/event事件回调,完成了data 数据的初始化,el没有。 然而,挂在阶段还没有开始, $el属性目前不可见,这是一个常用的生命周期,因为你可以调用methods中的方法,改变data中的数据,并且修改可以通过vue的响应式绑定体现在页面上,,获取computed中的计算属性等等,通常我们可以在这里对实例进行预处理,也有一些童鞋喜欢在这里发ajax请求,值得注意的是,这个周期中是没有什么方法来对实例化过程进行拦截的,因此假如有某些数据必须获取才允许进入页面的话,并不适合在这个方法发请求,建议在组件路由钩子beforeRouteEnter中完成
代码如下(示例):
created() {
var XMLHttpReq;
function createXMLHttpRequest() {
if(window.ActiveXObject )
{
try {
XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP");//IE高版本创建XMLHTTP
}
catch(E) {
XMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");//IE低版本创建XMLHTTP
}
}
else if(window.XMLHttpRequest)
{
XMLHttpReq = new XMLHttpRequest();//兼容非IE浏览器,直接创建XMLHTTP对象
if( XMLHttpReq .overrideMimeType )
{
XMLHttpReq .overrideMimeType( "text/xml" );
}
}
}
function sendAjaxRequest(url) {
createXMLHttpRequest(); //创建XMLHttpRequest对象
XMLHttpReq.open("post", url, true);
XMLHttpReq.onreadystatechange = processResponse; //指定响应函数
XMLHttpReq.send(null);
}
//回调函数
function processResponse() {
if (XMLHttpReq.readyState == 4) {
if (XMLHttpReq.status == 200) {
var text = XMLHttpReq.responseText;
}
}
}
}
Init (初始化) injections (依赖注入) & reactivity (开始响应),通过ajax请求数据
实例已经被创建,有了data,也可以对data进行计算和监听,这个阶段可以去请求数据,但是没有$el,实例还没有被挂载
4.beforeMount
挂在开始之前被调用,相关的render函数首次被调用(虚拟DOM),实例已完成以下的配置: 编译模板,把data里面的数据和模板生成html,完成了el和data 初始化,注意此时还没有挂在html到页面上。
代码如下(示例):
beforeMount() {
}
组件实例将要挂载到挂载点,页面未显示,开发中很少使用
这个阶段几乎和created阶段没有差别
5.mounted
挂在完成,也就是模板中的HTML渲染到HTML页面中,此时一般可以做一些ajax操作,mounted只会执行一次。
代码如下(示例):
mounted() {
console.log(this.$el)
}
组件模板已经渲染到指定的el,页面显示,可以操作动态数据,dom
这个阶段已经挂在了$el,dom树,可以获取dom,页面也有了可以操作动态数据,但是这个时候不能获取到根据动态数据改变的动态dom
6.beforeUpdate
在数据更新之前被调用,发生在虚拟DOM重新渲染和打补丁之前,可以在该钩子中进一步地更改状态,不会触发附加地重渲染过程
代码如下(示例):
beforeUpdate() {
//获取的是之前的dom,dom上的数据,data数据改变,dom还没有更新,正在监听被捕获的状态
console.log($el)
}
可以拿到Vue实例化改变前的状态。
update可以比作watch函数,beforeUpdate就是watch中的oldValue,包含了更新之前的dom,data数据
7.update
在由于数据更改导致地虚拟DOM重新渲染和打补丁只会调用,调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作,然后在大多是情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环,该钩子在服务器端渲染期间不被调用
代码如下(示例):
update() {
}
关于update的钩子函数,都是页面动态渲染有关,每当数据变化是,变会页面更新,都会触发这些钩子,这些钩子的触发频率很高,我们极少操作,即便操作,也要保证内部方法轻量级。
update可以比作watch函数,update就是watch中的newValue,包含了更新之后的dom,data数据
8.beforeDestroy
这一步还可以用this来获取实例,
一般在这一步做一些重置的操作,比如清除掉组件中的定时器 和 监听的dom事件
代码如下(示例):
beforeDestroy() {
}
消亡前的状态。
这一步还能获取到$el,有data、dom树
9.destroyed
在实例销毁之后调用,调用后,所以的事件监听器会被移出,所有的子实例也会被销毁,该钩子在服务器端渲染期间不被调用
代码如下(示例):
destroyed() {
}
消亡前的状态。