运行期间生命周期函数

沿着流程图继续往下看,将遇到运行期间生命周期函数。运行期间的第一个生命周期函数是 beforeUpdate。

并不是所有的 Vue 实例都会触发运行期间生命周期函数,当 data 中的数据发生改变时才会触发,如果 data 中的数据自始至终没有改变,那么运行期间的生命周期函数将不会被触发。

在视图层添加 “修改” 按钮,单击 “修改” 按钮修改 data 中的数据,代码如下。

视图层代码如下。

<div id="app" v-cloak>
    <h1 id="test">{{ msg }}</h1>
    <input type="button" value="修改" @click="f1">
</div>

M 层代码如下。

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            msg: 'Hello World'
        },
        methods: {
            f1() {
                this.msg = 'Hello Vue';
            }
        },
        beforeUpdate() {
            console.log('打印内存中的数据:' + this.msg); // 是最新的
            console.log('打印页面中的数据:' + document.getElementById('test').innerText); // 是旧的
        }
    });
</script>

运行结果如图 3-6 所示。

image 2025 02 11 12 29 24 982
Figure 1. 图3-6 beforeUpdate打印页面和内存中的数据

代码解析如下。

单击按钮修改 data 中 msg 的数据,当数据发生改变时,就会触发 beforeUpdate 生命周期函数,此时可以打印内存中的 msg,其值是最新的,即 “Hello Vue”。

但是在 beforeUpdate 中,页面上的值依然是 “Hello World”,说明此时 Vue 只是在内存中完成了编译,并没有挂载到真实页面中。

运行期间的最后一个周期函数为 updated,同样执行上述打印,代码如下。

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            msg: 'Hello World'
        },
        methods: {
            f1() {
                this.msg = 'Hello Vue';
            }
        },
        updated() {
            console.log('打印内存中的数据:' + this.msg); // 是最新的
            console.log('打印页面中的数据:' + document.getElementById('test').innerText); // 是最新的
        }
    });
</script>

运行结果如图 3-7 所示。

image 2025 02 11 12 31 47 211
Figure 2. 图3-7 updated打印页面和内存中的数据

根据上述运行结果,可以得出以下结论。

当 data 中数据发生变化时会触发 updated 函数,此时才真正把内存中修改后的数据挂载到页面中。