vue实例的生命周期钩子函数

vue实例从创建到最后的销毁这个过程中会自动的执行一些方法,也被称为vue实例的生命周期钩子函数,具体可以参照vue官方提供的生命周期图片

可以看到在vue的生命周期中会有很多钩子函数提供给我们在vue生命周期不同的时刻进行操作, 那么首先我们列出所有的钩子函数,再根据代码一一讲解:

beforeCreate 创建前
created 创建成功
beforeMount 挂载前
mounted 挂载完成
beforeUpdate 更新前
updated 更新完成
beforeDestroy 销毁前
destroyed 销毁完成

以下我们根据代码来看一下每个阶段发生了什么

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="app">
    <p>{{ message }}</p>
</div>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            message: 'hello world'
        },
        beforeCreat() {
            console.log('beforeCreate 创建前=====');
            console.log( "el     : " + this.$el);
            console.log("data   : " + this.$data);
            console.log("message: " + this.message)
        },
        created () {
            console.log('created 创建完成=====');
            console.log("el     : " + this.$el);
            console.log("data   : " + this.$data);
            console.log("message: " + this.message);
        },
        beforeMount () {
            console.log('beforeMount 挂载前=====');
            console.log("el     : " + (this.$el));
            console.log(this.$el);
            console.log("data   : " + this.$data);
            console.log("message: " + this.message);
        },
        mounted () {
            console.log('mounted 挂载完成=====');
            console.log("el     : " + this.$el);
            console.log(this.$el);
            console.log("data   : " + this.$data);
            console.log("message: " + this.message);
        },
        beforeUpdate () {
            console.log('beforeUpdate 更新前=====');
            console.log("el     : " + this.$el);
            console.log(this.$el);
            console.log("data   : " + this.$data);
            console.log("message: " + this.message);
        },
        updated() {
            console.log('updated 更新完成=====');
            console.log("el     : " + this.$el);
            console.log(this.$el);
            console.log("data   : " + this.$data);
            console.log("message: " + this.message);
        },
        beforeDestroy() {
            console.log('beforeDestroy 销毁前=====');
            console.log("el     : " + this.$el);
            console.log(this.$el);
            console.log("data   : " + this.$data);
            console.log("message: " + this.message);
        },
        destroyed() {
            console.log('destroyed 销毁完成=====');
            console.log("el     : " + this.$el);
            console.log(this.$el);
            console.log("data   : " + this.$data);
            console.log("message: " + this.message)
        }
    })
</script>
</body>
</html>

我们在实例里面分别执行这八个函数钩子,运行以上代码,在浏览器控制台中查看打印信息:

我们可以看到

beforeCreate创建前:el、data、message都是undefined的状态,这表明这些属性在这一阶段时还未进行初始化;

created创建完成:el处于undefined,data已经初始化完成,message已经能显示页面数据,所以在此阶段data已经与页面数据进行了绑定

beforeMount挂载前:el,data,message都已经初始化完成,el已经与页面div标签绑定,data也已进行绑定

mounted挂载完成:该阶段与上一阶段区别就是标签中有没有与data中的数据同步,我们分别点击beforeMount和mounted里面的div标签,分别如下图

会发现,两个阶段中的textContent内容不同,这也验证了我们上面的说法。

我们可以在控制台中看到前四个钩子函数,却没有后四个,这我们可以根据以上图示知道,vue实例若想触发beforeUpdate和updated函数必须要对data数据进行改变,我们在控制台中对data进行改变继续观察

可以发现当data中的数据发生了改变,会触发对应组件的重新渲染,先后调用beforeUpdate和updated钩子函数。两者的区别就是在beforeUpdate阶段可以监听到data的变化但是view层没有被重新渲染,view层的数据没有变化。而在updated的时候 view层才被重新渲染,数据更新

我们继续往下,当我们在控制台中将实例进行销毁时,就会触发最后两个钩子函数

在beforeDestroy阶段,函数在实例销毁之前调用。在这一步,实例仍然可用。
在destroye阶段,函数在Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解除绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。我们这个时候再来通过控制台修改数据会发现页面上的数据已经不能响应了

这些便是小编对vue实例生命周期函数的理解,如果有不足之处,还请大家指出