vue生命周期的理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue生命周期的理解相关的知识,希望对你有一定的参考价值。

如下图为Vue官网(https://cn.vuejs.org/v2/guide/instance.html#实例生命周期)给出的生命周期图示

技术分享

光看图或许不够直观,接下来就是一段代码来加强理解。

 

mounted方法及其之前

dom部分:

<div id="app">
    <p>{{message}}</p>
</div>

js部分:

<script>
        var app = new Vue({
            el: ‘#app‘,
            data: {
              message : "some data" 
            },
            beforeCreate: function () {
                console.log(‘beforeCreate 创建前状态===============》‘);
                console.log("%c%s", "color:red" , "el     : " + this.$el); 
                console.log("%c%s", "color:red","data   : " + this.$data);  
                console.log("%c%s", "color:red","message: " + this.message)  
            },
            created: function () {
                console.log(‘created 创建完毕状态===============》‘);
                console.log("%c%s", "color:red","el     : " + this.$el); 
                console.log("%c%s", "color:red","data   : " + this.$data);  
                console.log("%c%s", "color:red","message: " + this.message); 
            },
            beforeMount: function () {
                console.log(‘beforeMount 挂载前状态===============》‘);
                console.log("%c%s", "color:red","el     : " + (this.$el)); 
                console.log(this.$el);
                console.log("%c%s", "color:red","data   : " + this.$data);   
                console.log("%c%s", "color:red","message: " + this.message);   
            },
            mounted: function () {
                console.log(‘mounted 挂载结束状态===============》‘);
                console.log("%c%s", "color:red","el     : " + this.$el); 
                console.log(this.$el);    
                console.log("%c%s", "color:red","data   : " + this.$data); 
                console.log("%c%s", "color:red","message: " + this.message);  
            },
            beforeUpdate: function () {
                console.log(‘beforeUpdate 更新前状态===============》‘);
                console.log("%c%s", "color:red","el     : " + this.$el);
                console.log(this.$el);   
                console.log("%c%s", "color:red","data   : " + this.$data); 
                console.log("%c%s", "color:red","message: " + this.message); 
            },
            updated: function () {
                console.log(‘updated 更新完成状态===============》‘);
                console.log("%c%s", "color:red","el     : " + this.$el);
                console.log(this.$el); 
                console.log("%c%s", "color:red","data   : " + this.$data); 
                console.log("%c%s", "color:red","message: " + this.message); 
            },
            beforeDestroy: function () {
                console.log(‘beforeDestroy 销毁前状态===============》‘);
                console.log("%c%s", "color:red","el     : " + this.$el);
                console.log(this.$el);    
                console.log("%c%s", "color:red","data   : " + this.$data); 
                console.log("%c%s", "color:red","message: " + this.message); 
            },
            destroyed: function () {
                console.log(‘destroyed 销毁完成状态===============》‘);
                console.log("%c%s", "color:red","el     : " + this.$el);
                console.log(this.$el);  
                console.log("%c%s", "color:red","data   : " + this.$data); 
                console.log("%c%s", "color:red","message: " + this.message)
            }
        })
        </script>

以上代码的运行结果为:

技术分享

从运行结果可以看出来:

  在beforeCreated阶段,vue实例的挂载元素$el数据对象data都为undefined,还未初始化,

  在created阶段vue实例的数据对象data有了,$el还没有,

  在beforeMount阶段,vue实例的$eldata都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换

  在mounted阶段,vue实例挂载完成,data.message成功渲染

 

update部分

在浏览器控制台中输入 app.message = "new data",会出现如下变化

技术分享

可以发现,当data变化时,会触发beforeUpdate和updated方法

 

destroy部分

在浏览器控制台中输入app.$destroy()

技术分享

此时再继续修改message的值,在浏览器控制台输入app.message = "change after destory",你会发现:

技术分享

因此,在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。

 


以上是关于vue生命周期的理解的主要内容,如果未能解决你的问题,请参考以下文章

如何理解 Vue 中的生命周期

如何理解 Vue 中的生命周期

Vue生命周期的理解

vue中的生命周期的个人理解

简单理解vue的生命周期

vue 生命周期钩子的理解 watch computed