一、Vue3生命周期革新特性

相较于Vue2,Vue3通过Composition API带来了更灵活的生命周期管理方式。通过onBeforeMount等函数注册钩子时,实际是通过injectHook方法将回调函数注册到组件实例的hmr属性中。

在 Vue3 应用开发中,生命周期钩子函数扮演着至关重要的角色。它们允许开发者在组件从创建到销毁的各个阶段执行自定义逻辑,为开发者提供了对组件生命周期的精细控制能力。理解和熟练运用这些钩子函数,是开发高效、健壮 Vue3 应用的关键。

// Vue3源码片段(packages/runtime-core/src/apiLifecycle.ts)
export function injectHook(
type: LifecycleHook,
hook: Function & { __weh?: Function },
target: ComponentInternalInstance | null
) {
const hooks = target[type] || (target[type] = [])
hooks.push(hook)
}

二、创建阶段钩子函数

2.1 beforeCreate

  • 触发时机:在组件实例被创建之前,此时组件的 datacomputedmethods 等属性尚未初始化,无法访问 this
  • 使用场景:虽然在实际开发中 beforeCreate 使用较少,但在一些需要在组件创建前执行通用逻辑的场景下,例如记录组件创建日志等操作,可在此处编写代码。

2.2 created

  • 触发时机:组件实例创建完成后调用,此时 datacomputedmethods 等已初始化,可通过 this 访问组件的属性和方法,但 DOM 尚未挂载。
  • 使用场景:常用于进行数据的初始化操作,例如从本地存储中读取数据并赋值给组件的响应式数据,或进行一些简单的计算属性初始化。也适合在此处发起一些不需要依赖 DOM 的异步数据请求。
<template>
<div>{{ message }}</div>
</template> <script setup>
import { ref } from 'vue'; const message = ref(''); const fetchData = async () => {
const response = await fetch('/api/data');
const data = await response.json();
message.value = data.text;
}; fetchData();
</script>

三、挂载阶段钩子函数

3.1 beforeMount

  • 触发时机:在组件挂载到 DOM 之前调用,此时模板已经编译完成,但尚未将其挂载到实际的 DOM 节点上。
  • 使用场景:可用于在挂载前对模板或数据进行最后的调整,例如修改即将挂载的 DOM 的一些属性。不过由于 DOM 尚未挂载,直接操作 DOM 的意义不大。

3.2 mounted

  • 触发时机:组件成功挂载到 DOM 后调用,此时可以通过 $el 访问真实的 DOM 元素,或使用 refs 访问子组件及元素。
  • 使用场景:常用于需要操作 DOM 的场景,比如初始化第三方插件(如图表库、富文本编辑器等),这些插件通常需要在真实 DOM 存在的情况下进行初始化。也可以在此时进行一些依赖于 DOM 结构的计算或数据处理。

3.3 第三方库集成规范

以ECharts集成示例:

<template>
<div ref="chartContainer"></div>
</template> <script setup>
import { ref, onMounted } from 'vue';
import Chart from 'chart.js'; const chartContainer = ref(null); onMounted(() => {
if (chartContainer.value) {
new Chart(chartContainer.value, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [
{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}
]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
}
});
</script>

四、更新阶段钩子函数

4.1 beforeUpdate

  • 触发时机:在组件数据更新之前调用,此时组件的 data 已经发生变化,但 DOM 尚未更新。
  • 使用场景:可用于在数据更新前进行一些准备工作,例如保存当前 DOM 的状态,以便在更新后进行对比或恢复。

4.2 updated

  • 触发时机:组件数据更新且 DOM 重新渲染完成后调用。
  • 使用场景:适合进行一些依赖于更新后 DOM 状态的操作,例如重新计算一些基于新 DOM 结构的布局信息,或者对更新后的 DOM 进行进一步的样式调整。但需要注意,在 updated 钩子函数中操作 DOM 时要避免陷入死循环,因为再次修改数据可能会再次触发更新。
<template>
<div @click="updateData">
<p>{{ message }}</p>
</div>
</template> <script setup>
import { ref, onBeforeUpdate, onUpdated } from 'vue'; const message = ref('初始消息'); const updateData = () => {
message.value = '更新后的消息';
}; onBeforeUpdate(() => {
console.log('数据即将更新,当前消息:', message.value);
}); onUpdated(() => {
console.log('数据已更新,DOM 已重新渲染');
});
</script>

五、卸载阶段钩子函数

5.1 beforeUnmount

  • 触发时机:在组件实例被卸载之前调用,此时组件仍然存在,可以访问组件的属性和方法。
  • 使用场景:常用于清理组件在运行过程中创建的一些副作用,例如清除定时器、解绑事件监听器等,以避免内存泄漏。

5.2 unmounted

  • 触发时机:组件实例被成功卸载后调用,此时组件及其所有子组件都已从 DOM 中移除,组件相关的事件监听器、定时器等都已被清理。
  • 使用场景:理论上在此处已无需进行复杂操作,不过可以用于记录组件卸载相关的日志信息。
<template>
<div>
<p>{{ message }}</p>
</div>
</template> <script setup>
import { ref, onBeforeUnmount, onUnmounted } from 'vue'; const message = ref('组件内容');
let timer; const startTimer = () => {
timer = setInterval(() => {
console.log('定时器运行中');
}, 1000);
}; startTimer(); onBeforeUnmount(() => {
clearInterval(timer);
console.log('组件即将卸载,清除定时器');
}); onUnmounted(() => {
console.log('组件已卸载');
});
</script>

六、常见误区与解决方案

问题现象 原因分析 解决方案
mounted中获取DOM为null 异步渲染延迟 使用nextTick()
内存泄漏 未清理事件监听 建立清理函数注册表
重复请求 未取消前次请求 使用AbortController

写在最后

哈喽!大家好呀,我是 Code_Cracke,一名热爱编程的小伙伴。在这里,我将分享一些实用的开发技巧和经验心得。如果你也对编程充满热情,欢迎关注并一起交流学习!

如果你对这篇文章有任何疑问、建议或者独特的见解,欢迎在评论区留言。无论是探讨技术细节,还是分享项目经验,都能让我们共同进步。

Vue3生命周期钩子函数深度解析:从源码到实战的万字指南的更多相关文章

  1. vue之生命周期钩子函数之运用

    一.什么是生命周期钩子函数: 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等.同时在这个过程中也会运行 ...

  2. 关于 vue 生命周期 钩子函数 事件

    vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染->更新->渲染.卸载等一系列过程,我们称这是vue的生命周期. 通俗的将就是vue实例从创建到销毁 ...

  3. Vue生命周期 钩子函数和组件传值

    Vue生命周期 钩子函数 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等. 同时在这个过程中也会运行一 ...

  4. react中自定义函数、生命周期钩子函数、修改状态、组件、组件传值

    1.回顾 2.自定义函数 事件的首字母大小 onclick ==> onClick onchange ==> onChange 普通的点击事件 ---- 调用事件不加(),加了立即执行 i ...

  5. day68:Vue:类值操作/style样式操作&v-for&filer/computed/watch&生命周期钩子函数&axios

    目录 1.类值操作 :class 2.style操作样式 :style 3:示例:选项卡 @click+:class 4.v-for示例:循环商品显示 5.过滤器:filter 6.计算属性:comp ...

  6. vue生命周期 钩子函数

    首先,1.x和2.x的生命周期钩子对比: 钩子函数的树状图,红色的是我们可以利用的函数,绿色的是函数解析,蓝色的是函数执行时机 <!DOCTYPE html> <html> & ...

  7. 对vue生命周期/钩子函数的理解

    对于实现页面逻辑交互等效果,我们必须知晓vue的生命周期,才能愉快的玩耍,知道我们写的东西应该挂载到哪里,vue官方给出的api讲解的那叫一个简单啊,如下: 所有的生命周期钩子自动绑定this上下文到 ...

  8. Vue 2.0 生命周期-钩子函数理解

    Vue 2.0 + 生命周期钩子在项目过程中经常用到,所以闲下来整理了下,直接复制下面的实例运行: <!DOCTYPE html> <html lang="en" ...

  9. 了解angularjs中的生命周期钩子函数$onInit,$onChange,$onDestory,$postLink

     壹 ❀ 引 我在前面花了三篇文章用于介绍angularjs的指令directive,组件component,并专门花了一篇文章介绍directive与component的不同,其中提到在compon ...

  10. 什么是vue生命周期和生命周期钩子函数?

    原文地址 vue生命周期简介 咱们从上图可以很明显的看出现在vue2.0都包括了哪些生命周期的函数了. 生命周期探究 对于执行顺序和什么时候执行,看上面两个图基本有个了解了.下面我们将结合代码去看看钩 ...

随机推荐

  1. java double转string去除科学计数法"E" 非tostring()和valueOf()

    在遇到需要将double类型转换string类型时,会出现转成科学计数法的形式,希望字符串能原样输出.直接使用会报java.lang.Double cannot be cast to java.lan ...

  2. 龙哥量化:通达信的函数ma均线,ema、sma、dma的计算原理是什么,XMA是未来函数

    注意均线也有未来函数,常见的是跨周期的用法,会导致信号闪烁, 不常见的是XMA这个未来函数太坑了, [代写公式,龙哥微信:Long622889] MA.EMA.SMA.DMA.TMA.WMA6种平均算 ...

  3. Qt/C++编写的mqtt调试助手使用说明

    一.使用说明 第一步,选择协议前缀,可选mqtt://.mqtts://.ws://.wss://四种,带s结尾的是走ssl通信,ws表示走websocket通信.一般选默认的mqtt://就好. 第 ...

  4. Qt编写物联网管理平台41-自动清理早期数据

    一.前言 随着时间的增加,存储的历史记录也在不断增加,如果设备数量很多,存储间隔很短,不用多久,数据库中的记录就非常多,至少是百万级别起步,而且有些用户还是需要存储每一次的采集的数据,这数据量别说一年 ...

  5. Qt编写的项目作品4-输入法V2019

    一.功能特点 未采用Qt系统层输入法框架,独创输入切换机制. 纯QWidget编写,支持任何目标平台(亲测windows.linux.嵌入式linux等),支持任意Qt版本(亲测Qt4.6.0到Qt5 ...

  6. Qt开源作品6-通用视频控件

    一.前言 在之前做的视频监控系统中,根据不同的用户需要,做了好多种视频监控内核,有ffmpeg内核的,有vlc内核的,有mpv内核的,还有海康sdk内核的,为了做成通用的功能,不同内核很方便的切换,比 ...

  7. 在MBP上运行推理LLaMA-7B&13B模型

    在MBP上运行推理LLaMA-7B模型 build this repo # build this repo git clone https://github.com/ggerganov/llama.c ...

  8. linux获取当前用户名

    linux环境下获取当前登录用户名 方法1:  whoami 命令 1 $whoami 2 输出:username 3 $sudo whoami 4 输出:root 注意:通过不同用户权限执行获取的用 ...

  9. WPF 无边框窗体改变大小和移动

    WIN32 API: private const int WM_NCHITTEST = 0x0084; private readonly int agWidth = 12; //拐角宽度 privat ...

  10. docker没有vi不能执行yum报Device or resource busy

    最近在使用docker的过程中发现一个问题,就是想用vim编辑器编辑一个文件,发现连vi都没有. 于是想到一个办法用docker cp来解决问题: 首先执行docker ps -a查看容器的id 然后 ...