每一个组件或者实例都会经历一个完整的生命周期,总共分为三个阶段:初始化、运行中、销毁。
先放一张Vue官网的生命周期图:
vue有8种生命周期钩子函数:
-
beforeCreate --创建前
实例、组件通过new Vue() 创建出来之后会初始化事件和生命周期,然后就会执行beforeCreate钩子函数,这个时候,数据还没有挂载到,只是一个空壳,无法访问到数据和真实的dom,一般不做操作。 -
created --创建后
挂载数据,绑定事件等等,然后执行created函数,这个时候已经可以使用到数据,也可以更改数据,在这里同步更改数据不会触发updated函数,一般可以在这里做初始数据的获取。 做异步ajax,绑定初始化事件 。 -
beforeMount --渲染前
接下来开始找实例或者组件对应的模板,编译模板为虚拟dom放入到render函数中准备渲染,然后执行beforeMount钩子函数,在这个函数中虚拟dom已经创建完成,马上就要渲染,在这里也可以更改数据,不会触发updated,这是在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始化数据的获取 -
mounted --渲染后
接下来开始render,渲染出真实dom,然后执行mounted钩子函数,此时,组件已经出现在页面中,数据、真实dom都已经处理好了,事件都已经挂载好了,可以在这里操作真实dom等事情… -
beforeUpdate --更新前
当组件或实例的数据更改之后,会立即执行beforeUpdate,然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染,一般不做什么事儿。 -
updated —更新后
当更新完成后,执行updated,数据已经更改完成,dom也重新render完成,可以操作更新后的dom。 -
beforeDestroy —销毁前
当经过某种途径调用$destroy方法后,立即执行beforeDestroy,一般在这里做一些善后工作,例如清除计时器、清除非指令绑定的事件等等。 -
destroyed —销毁后
组件的数据绑定、监听…去掉后只剩下dom空壳,这个时候,执行destroyed(组件销毁时触发,vue实例解除了事件监听以及和dom的绑定(无响应了),但DOM节点依旧存在),在这里做善后工作也可以。
总结
(1)生命周期函数的执行顺序与书写的顺序无关
(2)更新阶段的生命周期函数是在组件的数据发生变化的时候执行的
(3)在有组件的嵌套的时候,生命周期函数的执行顺序是:父组件的beforeCreate->created->beforeMount;然后执行子组件的beforeCreate->created->beforeMount->mounted;最后执行父组件的mounted函数;各个子组件的生命周期函数的执行顺序按加载顺序执行;从这里可以知道,在父组件未完成挂载之前,子组件就完成了挂载,这个时候父子组件是可以进行数据的传递的
(4)组件进行销毁的时候,是先销毁的是父组件,然后销毁子组件
(5)以下是代码
父组件
export default {
name: "Layout",
components: { MyHeader, MyChild },
methods: {
send() {
// this.inputValue =
this.$router.push("myheader");
}
},
beforeCreate() {
console.log("我是函数beforeCreate");
},
created() {
console.log("我是函数created");
},
beforeMount() {
console.log("我是函数beforeMount");
},
mounted() {
console.log("我是函数mounted");
},
beforeUpdate() {
console.log("我是beforeUpdate");
},
updated() {
console.log("我是updated函数");
},
beforeDestroy() {
console.log("我是函数beforeDestory");
},
destroyed() {
console.log('我是函数destoryed');
},
filters: {
dataFormat(msg) {
return msg + "xxxxx";
}
},
data() {
return {
inputValue: ""
};
}
};
子组件
export default {
beforeCreate() {
console.log("我是MyChild函数beforeCreate");
},
created() {
console.log("我是MyChild函数created");
},
beforeMount() {
console.log("我是MyChild函数beforeMount");
},
mounted() {
console.log("我是MyChild函数mounted");
},
beforeUpdate() {
console.log("我是MyChild函数beforeUpdate");
},
updated() {
console.log("我是MyChild函数updated");
},
beforeDestroy() {
console.log("我是MyChild函数beforeDestory");
},
destroyed() {
console.log('我是MyChild函数destroyed');
}
}