简单易懂vue组件的生命周期,附带面试题中的vue周期相关题目(百分之八十的几率要问)

25 篇文章 0 订阅

一、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() {
}

消亡前的状态。

这一步和beforeDestroy操作不分彼此,在销毁组件的时候,要清除的定时器,事件监听器都在这两个阶段销毁,这一步依然能获取到$el,有data、dom树

10.附带面试题

1.dom是在什么时候创建的
2.created有什么操作
3.data数据是在什么时候获取

总结

good ninght
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值