最近一次写Vue的时候,因为父子组件都有声明周期函数,在操作顺序上出现了一些之前没有想到的问题,特此记录一下
生命周期函数
- beforeCreate、created、beforeMount、mounted
- beforeUpdate、updated、beforeDestroy、destroyed
- activated、deactivated
场景
<script>
let One = {
// ....
beforeCreate() {
console.warn("子组件的beforeCreate");
},
created() {
console.warn("子组件的created");
},
beforeMount() {
console.warn("子组件beforemount");
},
mounted() {
console.warn("子组件mounted");
},
// ....
};
new Vue({
// ...
components: {
One,
},
beforeCreate() {
console.log("父组件的beforeCreate");
},
created() {
console.log("父组件的created");
},
beforeMount() {
console.log("父组件beforemount");
},
mounted() {
console.log("父组件mounted");
},
// ...
});
</script>
- 上面的运行结果为:
分析
- 因为Vue是从根组件(Vue实例)开始执行的,然后依次去读取目标dom下的模板字符串开始进行解析和生成vdom,然后在这个过程中开始执行一些生命钩子函数,依次从beforeCreate->created->beforeMount,这里就开始准备生成vdom了
- 子组件是含括在父组件内部的,开始生成vdom时,每个组件都是一个实例,都会经历一圈生命周期函数,然后完成该组件的vdom后,才算整个vue的vdom完毕,所以父组件的mounted阶段才会在最后才执行