Vue3 生命周期(组合式 API)
相比选项式 API(Options API)简化了beforeCreate
, created
过程。
生命周期钩子
Composition API: Lifecycle Hooks
onMounted()
onUpdated()
onUnmounted()
onBeforeMount()
onBeforeUpdate()
onBeforeUnmount()
onErrorCaptured()
onRenderTracked()
onRenderTriggered()
onActivated()
onDeactivated()
onServerPrefetch()
页面组件渲染
渲染过程
父组件onBeforeMount
过程
↓
子组件onBeforeMount
过程
↓
子组件onRenderTracked
过程
↓
子组件onMounted
过程
↓
父组件onMounted
过程
在 Mounted
过程之前无法获取 模板中将要render
的 节点
beforeMounted
与Mounted
过程间 Initial render, create & insert DOM nodes
<script setup>
import { onBeforeMount, onMounted } from "vue";
document.querySelector(".mnode"); // null
onBeforeMount(() => {
document.querySelector(".mnode"); // null
});
onMounted(() => {
document.querySelector(".mnode"); // <div class="mnode">
});
</script>
<template>
<div class="mnode"></div>
</template>
确实想要在setup
和onBeforeMount
里拿到节点怎么办?
使用nextTick
, 等待页面渲染完成后获取
<script setup>
import { onBeforeMount, nextTick } from "vue";
nextTick(() => {
document.querySelector(".mnode"); // <div class="mnode">
});
onBeforeMount(async () => {
await nextTick();
document.querySelector(".mnode"); // <div class="mnode">
});
</script>
<template>
<div class="mnode"></div>
</template>
页面组件更新
更新过程
父组件onBeforeUpdate
过程
↓
父组件onBeforeUnmount
过程
↓
子组件onBeforeMount
过程
↓
父组件onUnmounted
过程
↓
子组件onMounted
过程
↓
父组件onUpdated
过程
DOM 数据更新
响应式数据(ref
, reactive
...)触发页面re-render
, patch
函数进行增量更新
更新过程
组件onBeforeUpdate
过程
↓
组件updated
过程
<script setup>
import { ref, onBeforeUpdate, onUpdated } from "vue";
const v = ref(0);
const plusv = () => {
v.value++;
};
onBeforeUpdate(() => {
console.log(document.querySelector(".v").textContent); // 0
});
onUpdated(() => {
console.log(document.querySelector(".v").textContent); // 1
});
</script>
<template>
<div @click="plusv" class="v">{{ v }}</div>
</template>
页面新旧组件切换
切换过程
父组件onBeforeUpdate
过程
↓
旧组件onBeforeUnmount
过程
↓
新组件onBeforeMount
过程
↓
旧组件onUnmounted
过程
↓
新组件onMounted
过程
↓
父组件onUpdated
过程
App.vue
<script setup>
import { onBeforeUpdate, onUpdated, shallowRef } from "vue";
import HelloWorld from "./components/HelloWorld.vue";
import ByeWorld from "./components/ByeWorld.vue";
const world = shallowRef(HelloWorld);
const switchWorld = () => {
world.value = ByeWorld;
};
onBeforeUpdate(() => {
console.log("App onBeforeUpdate");
});
onUpdated(() => {
console.log("App onUpdated");
});
</script>
<template>
<component :is="world" />
<br />
<div @click="switchWorld">switchWorld</div>
</template>
HelloWorld.vue
<script setup>
import { onBeforeUnmount, onUnmounted, ref } from "vue";
const HelloWorld = ref("HelloWorld");
onBeforeUnmount(() => {
console.log("HelloWorld onBeforeUnmount");
});
onUnmounted(() => {
console.log("HelloWorld onUnmounted");
});
</script>
<template>
<div>{{ HelloWorld }}</div>
</template>
ByeWorld.vue
<script setup>
import { onBeforeMount, onMounted, ref } from "vue";
const ByeWorld = ref("ByeWorld");
onBeforeMount(() => {
console.log("ByeWorld onBeforeMount");
});
onMounted(() => {
console.log("ByeWorld onMounted");
});
</script>
<template>
<div>{{ ByeWorld }}</div>
</template>