一、实列描述
根据打印结果查看打印顺序
1. 父组件【crTable.vue】
<template>
<div>
<span v-for="(item, index) in tabs" :key="index" @click="sum = item">{{ item }}</span>
</div>
<keep-alive>
<tabOne v-if="sum === 'tabOne'" />
</keep-alive>
<keep-alive>
<tabTwo v-if="sum === 'tabTwo'" />
</keep-alive>
</template>
<script lang="ts">
import { onMounted, onUnmounted, ref, onBeforeMount, onBeforeUpdate, onBeforeUnmount, onUpdated, onErrorCaptured } from 'vue';
import tabOne from './tabOne.vue';
import tabTwo from './tabTwo.vue';
export default {
name: 'crTable',
components: {
tabOne,
tabTwo,
},
// 开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
setup() {
let sum = ref('tabOne');
let tabs = ref(['tabOne', 'tabTwo']);
console.log('setup', 'vue3');
// vue3 生命周期钩子函数
// 组件挂载到节点上之前执行的函数
onBeforeMount(() => {
console.log('onBeforeMount', 'vue3');
});
// 组件挂载完成后执行的函数
onMounted(() => {
console.log('onMounted', 'vue3');
});
// 组件更新之前执行的函数
onBeforeUpdate(() => {
console.log('onBeforeUpdate', 'vue3');
});
// 组件更新完成之后执行的函数
onUpdated(() => {
console.log('onUpdated', 'vue3');
});
// 组件卸载之前执行的函数
onBeforeUnmount(() => {
console.log('onBeforeUnmount', 'vue3');
});
// 组件卸载完成后执行的函数
onUnmounted(() => {
console.log('onUnmounted', 'vue3');
});
// 当捕获一个来自子孙组件的异常时激活钩子函数
onErrorCaptured(() => {
console.log('onErrorCaptured', 'vue3');
});
return {
sum,
tabs,
};
},
};
</script>
<style lang="scss">
</style>
进入页面执行顺序【tabOne与tabTwo是子组件】默认tabOne组件
- crTable.vue
setup vue3- crTable.vue
onBeforeMount vue3- tabOne.vue
setup tabOne vue3- tabOne.vue
onBeforeMount tabOne vue3- tabOne.vue
onMounted tabOne vue3- tabOne.vue
onActivated tabOne vue3被包含在<keep-alive>中的组件,会多出两个生命周期钩子函数,被激活时执行- crTable.vue
onMounted vue3
点击切换执行顺序
- crTable.vue
onBeforeUpdate vue3- tabTwo.vue
setup tabTwo vue3- tabTwo.vue
onBeforeMount tabTwo vue3- tabOne.vue
onDeactivated tabOne vue3组件消失时执行- tabTwo.vue
onMounted tabTwo vue3- tabTwo.vue
onActivated tabTwo vue3被包含在<keep-alive>中的组件,会多出两个生命周期钩子函数,被激活时执行- crTable.vue
onUpdated vue3
2. 子组件
tabOne组件
onActivated(()=>{}) 与 onDeactivated(()=>{})切换组件时执行的顺序
修改 sum 值内部的执行顺序
- tabOne.vue
onBeforeUpdate tabOne vue3- tabOne.vue
onUpdated tabOne vue3
<template>
<div class="cr-list">{{ sum }}</div>
<button @click="sum -= 1">减减</button>
</template>
<script lang="ts">
import { onMounted, onUnmounted, ref, onBeforeMount, onBeforeUpdate, onBeforeUnmount, onUpdated, onActivated, onDeactivated } from 'vue';
export default {
name: 'crTable',
// 开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
setup() {
let sum = ref(0);
console.log('setup', 'tabOne', 'vue3');
// vue3 生命周期钩子函数
// 组件挂载到节点上之前执行的函数
onBeforeMount(() => {
console.log('onBeforeMount', 'tabOne', 'vue3');
});
// 组件挂载完成后执行的函数
onMounted(() => {
console.log('onMounted', 'tabOne', 'vue3');
});
// 组件更新之前执行的函数
onBeforeUpdate(() => {
console.log('onBeforeUpdate', 'tabOne', 'vue3');
});
// 组件更新完成之后执行的函数
onUpdated(() => {
console.log('onUpdated', 'tabOne', 'vue3');
});
// 组件卸载之前执行的函数
onBeforeUnmount(() => {
console.log('onBeforeUnmount', 'tabOne', 'vue3');
});
// 组件卸载完成后执行的函数
onUnmounted(() => {
console.log('onUnmounted', 'tabOne', 'vue3');
});
// 被包含在 <keep-alive> 中的组件,会多出两个生命周期钩子函数,被激活时执行
onActivated(() => {
console.log('onActivated', 'tabOne', 'vue3');
});
// 比如从 A 组件,切换到 B 组件,A 组件消失时执行
onDeactivated(() => {
console.log('onDeactivated', 'tabOne', 'vue3');
});
return {
sum,
};
},
};
</script>
<style lang="scss">
</style>
tabTwo组件
onActivated(()=>{}) 与 onDeactivated(()=>{})切换组件时执行的顺序
修改 sum 值内部的执行顺序
- tabTwo.vue
onBeforeUpdate tabTwo vue3- tabTwo.vue
onUpdated tabTwo vue3
<template>
<div class="cr-list">{{ sum }}</div>
<button @click="sum += 1">加加</button>
</template>
<script lang="ts">
import { onMounted, onUnmounted, ref, onBeforeMount, onBeforeUpdate, onBeforeUnmount, onUpdated, onActivated, onDeactivated } from 'vue';
export default {
name: 'crTable',
// 开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
setup() {
let sum = ref(0);
console.log('setup', 'tabTwo', 'vue3');
// vue3 生命周期钩子函数
// 组件挂载到节点上之前执行的函数
onBeforeMount(() => {
console.log('onBeforeMount', 'tabTwo', 'vue3');
});
// 组件挂载完成后执行的函数
onMounted(() => {
console.log('onMounted', 'tabTwo', 'vue3');
});
// 组件更新之前执行的函数
onBeforeUpdate(() => {
console.log('onBeforeUpdate', 'tabTwo', 'vue3');
});
// 组件更新完成之后执行的函数
onUpdated(() => {
console.log('onUpdated', 'tabTwo', 'vue3');
});
// 组件卸载之前执行的函数
onBeforeUnmount(() => {
console.log('onBeforeUnmount', 'tabTwo', 'vue3');
});
// 组件卸载完成后执行的函数
onUnmounted(() => {
console.log('onUnmounted', 'tabTwo', 'vue3');
});
// 被包含在 <keep-alive> 中的组件,会多出两个生命周期钩子函数,被激活时执行
onActivated(() => {
console.log('onActivated', 'tabTwo', 'vue3');
});
// 比如从 A 组件,切换到 B 组件,A 组件消失时执行
onDeactivated(() => {
console.log('onDeactivated', 'tabTwo', 'vue3');
});
return {
sum,
};
},
};
</script>
<style lang="scss">
</style>
二、生命周期钩子函数描述 <keep-alive>包裹
其他钩子函数请看 vue3.0生命周期
- onActivated(()=>{})
被包含在
<keep-alive>中的组件,会多出两个生命周期钩子函数,组件被激活时执行【请看上文实例执行】
- onDeactivated(()=>{})
比如从 tabOne 组件,切换到 tabTwo 组件,tabOne 组件消失时执行 【请看上文实例执行】
- onErrorCaptured(()=>{})
捕获tabOne组件 和 tabTwo组件 的异常时激活钩子函数,此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回
false以阻止该错误继续向上传播。【当捕获一个来自子孙组件的异常时激活钩子函数】