Vue的生命周期,各个组件间的执行情况。
注:本文是以Vue2.x版本展开叙述
Vue的组件都是独立存在的,每个组件都要经历他自己的生命周期
。Vue的生命周期是指组件:
创建—>数据初始化—>挂载—>更新—>销毁
简单的来说就是组件从创建到销毁之间的过程
生命周期钩子也叫生命周期函数也叫生命周期事件,vue中他自己携带了八个生命周期函数,如下:
beforeCreate:
实例刚在内存中被创建出来,此时,还没有初始化完成data和methods属性。
created:
实例已经在内存中创建完成,此时data和menthods以及创建完成,但没有开始编译模板。
beforeMount:
此时完成了模板的编译,但没有进行挂载。
mounted:
此时已经完成挂载到指定容器中显示了。
代码演示:
var app = new Vue({
el: "#app",
data: {
message: "Hello Vue!"
},
methods: {
changeMessage() {
this.message='改变了!'
}
},
beforeCreate() {
console.log("---------- 初始化前 beforeCreate-----------");
this.message===undefined?console.log('message没拿到'):console.log(this.message);
this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
},
created() {
console.log("---------- 初始化完成 created----------");
this.message===undefined?console.log('message没拿到'):console.log(this.message);
this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
},
beforeMount() {
console.log("---------- 挂载前 beforeMount----------");
this.message===undefined?console.log('message没拿到'):console.log(this.message);
this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
},
mounted() {
console.log("---------- 挂载完成 mounted----------");
this.message===undefined?console.log('message没拿到'):console.log(this.message);
this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
},
beforeUpdate() {
console.log("---------- 更新前 beforeUpdate----------");
this.message===undefined?console.log('message没拿到'):console.log(this.message);
this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
},
updated() {
console.log("---------- 更新完成 updated----------");
this.message===undefined?console.log('message没拿到'):console.log(this.message);
this.$el===undefined?console.log('el没拿到'):console.log(this.$el);
}
});
创建阶段运行结果:
可以看到首次加载只会运行前四个周期函数,在挂载前才能拿到el属性,如果要操作DOM节点最早在挂在完成 mounted中操作。
运行阶段运行结果:
是vue自带的内部组件,是用来缓存组件的,达到提升性能的目的。
当使用keep-alive后会增加两个生命周期函数:
activated
在 keep-alive 组件激活时调用, 该钩子函数在服务器端渲染期间不被调用。
承担原来created钩子中获取数据的任务
在第一次进入keep-alive包裹的组件时,会调用 beforeCreate、created、beforeMount、mounted、activated;这五个生命周期函数。
当第二次或第n次进入时只会调用activated
deactivated
在 keep-alive 组件停用时调用,该钩子在服务器端渲染期间不被调用。
Props有三个include、exclude、max。
过程:
父组件beforeCreate --> 父组件created --> 父组件beforeMount --> 子组件beforeCreate --> 子组件created --> 子组件beforeMount --> 子组件mounted --> 父组件mounted
过程:
子组件beforeUpdate --> 子组件updated
父组件beforeUpdate --> 父组件updated
父组件beforeDestroy --> 子组件beforeDestroy --> 子组件destroyed --> 父组件destroyed
父组件代码
<template>
<div style="border: 2px #1E1E1E; height: 500px;width: 500px;background-color: blueviolet; text-align: center">
<span>{{message}}</span>
<button @click="changef" >父组件改变</button>
<Son></Son>
<button @click="destroy">点击销毁</button>
</div>
</template>
<script>
import Son from './components/Son.vue'
export default {
name: 'App',
components: {
Son
},
data() {
return {
message: "父组件"
}
},
methods: {
changef(){
this.message='父组件改变了'
},
destroy(){
this.$destroy();
console.log('销毁完成');
}
},
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('---------- 父组件销毁前 beforeDestroy----------');
},
destroyed(){
console.log('---------- 父组件销毁后 destroyed----------')
}
}
</script>
子组件代码
<template>
<div>
<div style="border: 2px #1E1E1E; height: 200px;width:200px;background-color: aqua;">
<span>{{message}}</span>
<button @click="changes">子组件改变</button>
</div>
</div>
</template>
<script>
export default {
// eslint-disable-next-line vue/multi-word-component-names
name: 'Son',
props: {
},
data() {
return {
message: "子组件"
}
},
methods: {
changes(){
this.message='子组件改变了'
}
},
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('---------- 子组件销毁前 beforeDestroy----------');
},
destroyed(){
console.log('---------- 子组件销毁后 destroyed----------')
}
}
</script>