vue3生命周期详解

在 Vue 3 中,生命周期函数用于在组件的不同阶段执行特定的操作。Vue 3 提供了组合式 API 和选项式 API 两种方式来使用生命周期函数,下面分别进行详细介绍。

选项式 API 的生命周期函数

选项式 API 的生命周期函数与 Vue 2 的基本相似,但部分名称有所变化。以下是 Vue 3 选项式 API 中主要的生命周期函数及其详细解释

<template>
  <div>这是一个示例组件</div>
</template>

<script>
export default {
  // 组件实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用
  beforeCreate() {
    console.log('beforeCreate: 此时还不能访问 data 和 methods');
  },
  // 实例已经创建完成之后被调用。在这一步,实例已经完成了数据观测 (data observer)、property 和 method 的计算、watch/event 事件回调的配置等
  created() {
    console.log('created: 可以访问 data 和 methods');
  },
  // 在挂载开始之前被调用:相关的 render 函数首次被调用
  beforeMount() {
    console.log('beforeMount: 模板编译完成,但还未挂载到页面');
  },
  // el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子
  mounted() {
    console.log('mounted: 组件已经挂载到页面,可以访问 DOM 元素');
  },
  // 在数据发生变化之前被调用
  beforeUpdate() {
    console.log('beforeUpdate: 数据即将更新,但 DOM 还未更新');
  },
  // 在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用
  updated() {
    console.log('updated: 数据更新完成,DOM 已经更新');
  },
  // 在实例销毁之前调用。在这一步,实例仍然完全可用
  beforeUnmount() {
    console.log('beforeUnmount: 组件即将销毁,但仍然完全可用');
  },
  // 实例已经销毁之后调用。在这一步,所有的事件监听器和子实例都已经被销毁
  unmounted() {
    console.log('unmounted: 组件已经销毁,无法访问组件的任何属性和方法');
  },
  // 当捕获一个来自子孙组件的错误时被调用
  errorCaptured(err, vm, info) {
    console.log('errorCaptured: 捕获到子孙组件的错误', err, vm, info);
  },
  // 在渲染函数被跟踪的依赖项失效时调用
  renderTracked(event) {
    console.log('renderTracked: 渲染函数的依赖项被跟踪', event);
  },
  // 在渲染函数被跟踪的依赖项变更时调用
  renderTriggered(event) {
    console.log('renderTriggered: 渲染函数的依赖项被触发变更', event);
  },
  // 当组件实例在 keep-alive 缓存中被插入时调用
  activated() {
    console.log('activated: 组件被插入到 keep-alive 缓存中');
  },
  // 当组件实例在 keep-alive 缓存中被移除时调用
  deactivated() {
    console.log('deactivated: 组件从 keep-alive 缓存中移除');
  }
};
</script>

组合式 API 的生命周期函数

组合式 API 使用导入的函数来替代选项式 API 中的生命周期钩子。以下是对应的组合式 API 生命周期函数:

<template>
  <div>这是一个示例组件</div>
</template>

<script setup>
import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, onActivated, onDeactivated, onErrorCaptured, onRenderTracked, onRenderTriggered } from 'vue';

// 在挂载开始之前被调用
onBeforeMount(() => {
  console.log('onBeforeMount: 模板编译完成,但还未挂载到页面');
});

// el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子
onMounted(() => {
  console.log('onMounted: 组件已经挂载到页面,可以访问 DOM 元素');
});

// 在数据发生变化之前被调用
onBeforeUpdate(() => {
  console.log('onBeforeUpdate: 数据即将更新,但 DOM 还未更新');
});

// 在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用
onUpdated(() => {
  console.log('onUpdated: 数据更新完成,DOM 已经更新');
});

// 在实例销毁之前调用
onBeforeUnmount(() => {
  console.log('onBeforeUnmount: 组件即将销毁,但仍然完全可用');
});

// 实例已经销毁之后调用
onUnmounted(() => {
  console.log('onUnmounted: 组件已经销毁,无法访问组件的任何属性和方法');
});

// 当捕获一个来自子孙组件的错误时被调用
onErrorCaptured((err, vm, info) => {
  console.log('onErrorCaptured: 捕获到子孙组件的错误', err, vm, info);
});

// 在渲染函数被跟踪的依赖项失效时调用
onRenderTracked((event) => {
  console.log('onRenderTracked: 渲染函数的依赖项被跟踪', event);
});

// 在渲染函数被跟踪的依赖项变更时调用
onRenderTriggered((event) => {
  console.log('onRenderTriggered: 渲染函数的依赖项被触发变更', event);
});

// 当组件实例在 keep-alive 缓存中被插入时调用
onActivated(() => {
  console.log('onActivated: 组件被插入到 keep-alive 缓存中');
});

// 当组件实例在 keep-alive 缓存中被移除时调用
onDeactivated(() => {
  console.log('onDeactivated: 组件从 keep-alive 缓存中移除');
});
</script>

生命周期函数的执行顺序

组件的生命周期函数按照以下顺序执行:

  1. beforeCreate
  2. created
  3. beforeMount
  4. mounted
  5. 数据更新时:
    • beforeUpdate
    • updated
  6. 组件销毁时:
    • beforeUnmount
    • unmounted

在使用keep-alive组件时,还会涉及activateddeactivated生命周期函数。

通过合理使用生命周期函数,你可以在组件的不同阶段执行特定的操作,如初始化数据、操作 DOM、清理资源等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谨666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值