在看这篇文章之前,可以先看看vue:https://cn.vuejs.org/v2/guide/instance.html#生命周期图示
官网主要介绍了beforeCreate、created、beforeMount、mounted、beforeUpdate、update、befpreDestroy、destroyed八个阶段(其实还有active等阶段)。
下面我们通过一个组件的执行输出来搞清楚每个阶段发生了什么。
<template> <div id="wer"> <h1 @click="updateData">{{message}}</h1> <h2>{{helloCom}}</h2> </div> </template> <script> export default { data() { return{ message: 'Vue的生命周期', } }, computed: { helloCom(){ return this.message + ' computed;'; }, }, methods:{ updateData(){ this.message = "update message"; } }, beforeCreate: function() { console.group('------beforeCreate创建前状态------'); console.log( "el : " + this.$el); //undefined console.log("data : " + this.$data); //undefined console.log("message: " + this.message); //undefined console.log("computed: " + this.helloCom); //undefined }, created: function() { console.group('------created创建完毕状态------'); console.log("el : " + this.$el); //undefined console.log("data : " + this.$data); //[object Object] console.log("message: " + this.message); //Vue的生命周期 console.log("computed: " + this.helloCom); // Vue的生命周期 computed }, beforeMount: function() { console.group('------beforeMount挂载前状态------'); console.log("el : " + (this.$el)); //undefined console.log("data : " + this.$data); //[object Object] console.log("message: " + this.message); //Vue的生命周期 console.log("computed: " + this.helloCom); // Vue的生命周期 computed }, mounted: function() { console.group('------mounted 挂载结束状态------'); console.log("el : " + this.$el); //[object HTMLDivElement] console.log(this.$el); console.log("data : " + this.$data); //[object Object] console.log("message: " + this.message); //Vue的生命周期 console.log("computed: " + this.helloCom); // Vue的生命周期 computed }, beforeUpdate: function () { console.group('beforeUpdate 更新前状态===============》'); console.log("el : " + this.$el);// [object HTMLDivElement] console.log(this.$el); console.log("data : " + this.$data); //[object Object] console.log("message: " + this.message); // Vue的生命周期 console.log("computed: " + this.helloCom);// Vue的生命周期 computed }, updated: function () { console.group('updated 更新完成状态===============》'); console.log("el : " + this.$el);// [object HTMLDivElement] console.log(this.$el); console.log("data : " + this.$data); //[object Object] console.log("message: " + this.message); // Vue的生命周期 console.log("computed: " + this.helloCom);// Vue的生命周期 computed }, beforeDestroy: function () { console.group('beforeDestroy 销毁前状态===============》'); console.log("el : " + this.$el); console.log(this.$el); console.log("data : " + this.$data); console.log("message: " + this.message); console.log("computed: " + this.helloCom); }, destroyed: function () { console.group('destroyed 销毁完成状态===============》'); console.log("el : " + this.$el); console.log(this.$el); console.log("data : " + this.$data); console.log("message: " + this.message) console.log("computed: " + this.helloCom); } } </script> <style lang="stylus" scoped> </style>
执行完之后,结果如下:
下面我们来一一分析一下:
beforeCreate创建前状态:
如图所示,在该阶段,肉眼可见的变化很少,主要是初始化一些时间。
created创建完毕状态:
如图所示,在该阶段,除了挂载点之外,其他元素都已准备就绪。
beforeMount挂载前状态:
如图所示,在该阶段,准备挂载点,但是挂载元素依然不存在。
mounted 挂载结束状态:
此时所有指令生效,数据变化已经能触发DOM更新,但不能保证$el已经插入文档。
beforeUpdate 更新前状态:
触发了页面的event时间后,也就触发了update阶段,此时DOM尚未更新。
updated 更新完成状态:
更新DOM结构示例。
beforeDestroy 销毁前状态:
在开始销毁实例时调用,此刻实例仍然有效。
destroyed 销毁完成状态:
实例被销毁之后调用,此刻所有绑定和实例指令都已经解绑,子实例也被销毁。
activated
需要配合动态组件keep-live使用,在动态组件初始化渲染的过程中调用该方法。
deactivated
需要配合动态组件keep-live使用,在动态组件移除的过程中调用该方法。