Vue的生命周期钩子

浮生半日闲 发布于 2023-09-10 17 次阅读


vue组件实例在创建时经历的一系列初始化步骤,在此过程中,它也会运行被称为生命周期钩子的函数,让开发者可以在特定阶段运行自己的代码。

onMounted()

注册一个回调函数,在组件挂载完成后执行。组件在一下情况会被视为挂载完成:

  • 其所有同步子组件都已经被挂载 (不包含异步组件或 <Suspense> 树内的组件);
  • 其自身的 DOM 树已经创建完成并插入了父容器中。

使用方法:

<script setup lang="ts">
import { ref, onMounted } from 'vue';

const count = ref()

onMounted(() => {
    count.value ++;
})

</script>

使用场景:

(1)数据请求:确保组件完全挂载后再进行数据的请求,防止因数据请求事件导致的二次渲染带来的性能损耗;

(2)处理dom元素:可以使用原生API对dom元素进行操作;

(3)优化初始化效率:可以将一些初始化代码延迟到挂载后再执行,提升初始化效率。

onUpdated()

注册一个回调函数,在组件因为响应式状态变更而更新其 DOM 树之后调用。注意:父组件的更新钩子将在其子组件的更新钩子之后调用。

dom的更新不是同步的,如果需要在某个特定的状态更改后访问更新后的 DOM,可以使用 nextTick() 。

<template>
    <button id="count" @click="count++">{{ count }}</button>
</template>

<script setup lang="ts">
import { ref, onUpdated } from 'vue';

const count = ref(0)

onUpdated(() => {
    // 文本内容应该与当前的 `count.value` 一致
    console.log(document.getElementById('count')?.textContent)
})
</script>

onUnmounted()

注册一个回调函数,在组件实例被卸载以后调用。以下情况被视为已卸载:

  • 其所有子组件都已经卸载;
  • 所有相关的响应式作用 (渲染作用以及 setup() 时创建的计算属性和侦听器) 都已经停止。

可以在这个钩子里面清理一些不再需要的功能,如计时器、dom事件的监听或者与服务器的连接。

<script setup lang="ts">
import { onMounted, onUnmounted } from 'vue'

let intervalId: number
onMounted(() => {
  intervalId = setInterval(() => {
    // ...
  })
})

onUnmounted(() => clearInterval(intervalId))
</script>

onBeforeMount()

注册一个回调函数,在组件被挂载前调用。

这个钩子在调用时,组件已经完成了其响应式状态的设置,但还没有创建dom节点。它即首次执行dom渲染过程。

onBeforeUpdate()

注册一个钩子,在组件即将因为响应式状态变更而更新其 DOM 树之前调用。

这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。

onBeforeUnmount()

注册一个钩子,在组件实例被卸载之前调用。

当这个钩子被调用时,组件实例依然还保有全部的功能。

onActivated()

注册一个回调函数,若组件实例是 <KeepAlive> 缓存树的一部分,当组件被插入到 DOM 中时调用。

注意:onActivated钩子在组件挂载时也会调用。

onDeactivated()

注册一个回调函数,若组件实例是 <KeepAlive> 缓存树的一部分,当组件从 DOM 中被移除时调用。

当一个组件实例从 DOM 上移除但因为被 <KeepAlive> 缓存而仍作为组件树的一部分时,它将变为不活跃状态而不是被卸载。当一个组件实例作为缓存树的一部分插入到 DOM 中时,它将重新被激活

注意:onDeactivated钩子在组件卸载时也会调用。

onErrorCaptured()

注册一个钩子,在捕获了后代组件传递的错误时调用。

onRenderTracked() 

注册一个调试钩子,当组件渲染过程中追踪到响应式依赖时调用。仅在开发模式下可用

onRenderTriggered() 

注册一个调试钩子,当响应式依赖的变更触发了组件渲染时调用。仅在开发模式下可用

onServerPrefetch()

注册一个异步函数,在组件实例在服务器上被渲染之前调用。

生命周期图示