Vue 3 中的常用生命周期函数使用场景详解

目录

引言

1. beforeCreate()

2. created()

3. beforeMount()

4. mounted()

5. beforeUpdate()

6. updated()

7. beforeUnmount()

总结

引言

在 Vue 3 中,虽然 setup() 函数是 Composition API 的入口点,但传统的 Options API 中的生命周期钩子仍然可用,并且它们的使用方式和 Vue 2 中非常相似。下面我们将详细解释 Vue 3 中一些常用的生命周期函数的使用场景,并通过代码示例来说明其背后的原因。

1. beforeCreate()

        使用场景:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。此时组件的选项对象还未被创建,el 和 data 都为 undefined,无法访问到数据和 DOM。

代码示例(通常不推荐在此阶段进行任何操作,因为很多功能都不可用):

<script>  
export default {  
  beforeCreate() {  
    // 很少在此阶段进行操作,因为组件实例尚未完全创建  
    console.log('beforeCreate 钩子被调用');  
  },  
  // ...  
}  
</script>

原因:由于此时组件实例还未完全创建,通常没有太多实际用途,但在某些高级用法中(如插件开发)可能会用到。

2. created()

        使用场景:在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,以及 watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

代码示例

<script>  
export default {  
  data() {  
    return {  
      message: 'Hello Vue 3!'  
    };  
  },  
  created() {  
    // 组件实例已创建,可以访问到 data 中的数据  
    console.log('created 钩子被调用', this.message);  
    // 可以在这里发起异步请求或执行初始化操作  
  },  
  // ...  
}  
</script>

原因created 钩子非常适合执行非 DOM 相关的初始化操作,如数据初始化、网络请求等。

3. beforeMount()

        使用场景:在挂载开始之前被调用:相关的 render 函数首次被调用。此时模板编译完成,但尚未挂载到页面上,$el 属性目前不可见。

代码示例

<script>  
export default {  
  beforeMount() {  
    // 模板编译完成,但尚未挂载到页面上  
    console.log('beforeMount 钩子被调用');  
    // 可以在这里对即将被挂载的模板做一些处理  
  },  
  // ...  
}  
</script>

原因beforeMount 钩子在模板编译完成后执行,但此时 DOM 还未挂载,因此可以在此阶段对模板进行一些处理,如修改虚拟 DOM。

4. mounted()

        使用场景:实例被挂载后调用,此时 el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个 in-document 元素,当 mounted 被调用时 vm.$el 也在文档内。

代码示例

<script>  
export default {  
  mounted() {  
    // 组件已挂载到页面上,可以访问到 DOM  
    console.log('mounted 钩子被调用');  
    // 可以在这里执行 DOM 操作或启动第三方库  
  },  
  // ...  
}  
</script>

原因mounted 钩子在 DOM 挂载完成后执行,因此可以安全地访问和修改 DOM。

5. beforeUpdate()

        使用场景:数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。

代码示例

<script>  
export default {  
  beforeUpdate() {  
    // 数据更新,但 DOM 还未重新渲染  
    console.log('beforeUpdate 钩子被调用');  
    // 可以在这里访问更新前的 DOM 状态  
  },  
  // ...  
}  
</script>

原因:在 beforeUpdate 钩子中,你可以访问到更新前的 DOM 状态,这在某些需要处理更新过程中副作用的情况下非常有用。

6. updated()

        使用场景:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。

代码示例

<template>  
  <div>{{ message }}</div>  
</template>  
  
<script>  
export default {  
  data() {  
    return {  
      message: 'Hello Vue 3!'  
    };  
  },  
  updated() {  
    // DOM 已更新,可以执行依赖于 DOM 的操作  
    console.log('updated 钩子被调用', this.message);  
    // 可以在这里访问更新后的 DOM 状态,并执行相关的 DOM 操作  
  },  
  methods: {  
    changeMessage() {  
      this.message = 'Hello, updated!';  
    }  
  },  
  // ...  
}  
</script>

原因updated 钩子在数据更新并重新渲染 DOM 后调用,因此可以访问到更新后的 DOM 状态。这在进行一些依赖于 DOM 状态的操作(如重新计算布局、更新动画等)时非常有用。但请注意,避免在此钩子中修改数据,因为这可能导致无限更新循环。

7. beforeUnmount()

使用场景:组件实例卸载之前调用。在这个阶段,实例仍然完全可用。

代码示例

<script>  
export default {  
  beforeUnmount() {  
    // 组件即将被卸载  
    console.log('beforeUnmount 钩子被调用');  
    // 可以在这里清理定时器、移除事件监听器等  
  },  
  // ...  
}  
</script>

 原因:在组件卸载之前,我们需要确保清理掉任何可能导致内存泄漏或意外的副作用的资源。使用 beforeUnmount 可以确保这些资源在组件卸载时得到正确清理。

总结

        Vue 3 的生命周期钩子为开发者提供了在组件生命周期的不同阶段执行特定逻辑的能力。通过合理使用这些钩子,我们可以更好地管理组件的状态、DOM 操作和副作用,从而创建出更高效、更健壮的 Vue 应用程序。每个钩子都有其特定的使用场景,了解并正确使用它们可以大大提高我们的开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/594428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ThreeJS:光线投射与3D场景交互

光线投射Raycaster 光线投射详细介绍可参考&#xff1a;https://en.wikipedia.org/wiki/Ray_casting&#xff0c; ThreeJS中&#xff0c;提供了Raycaster类&#xff0c;用于进行鼠标拾取&#xff0c;即&#xff1a;当三维场景中鼠标移动时&#xff0c;利用光线投射&#xff0c;…

点亮一个LED

新建项目 #include <REGX52.H>void main() {P2 0xFE;while(1){} }调整字体大小 在编译之前要勾选一个东西,不然scp读取不了 去stc-isp中烧录进51单片机 两个地方要勾选,一个是单片机型号,一个是串口号,我的单片机型号不是江科大视频里面那个型号,所以不能按视频里面来选…

【数据结构(邓俊辉)学习笔记】列表04——排序器

文章目录 0. 统一入口1. 选择排序1.1 构思1.2 实例1.3 实现1.4 复杂度 2. 插入排序2.1 构思2.2 实例2.3 实现2.4 复杂度分析2.5 性能分析 3. 归并排序3.1 二路归并算法3.1.1 二路归并算法原理3.1.2 二路归并算法实现3.1.3 归并时间 3.2 分治策略3.2.1 实现3.2.2 排序时间 4. 总…

学习笔记:【QC】Android Q - IMS 模块

一、IMS init 流程图 二、IMS turnon 流程图 三、分析说明 1、nv702870 不创建ims apn pdp 2、nv702811 nv702811的时候才创建ims pdp&#xff1a; ims pdp 由ims库发起&#xff0c;高通没有开放这部分代码&#xff1a; 10-10 11:45:53.027 943 943 E Diag_Lib: [IMS_D…

只用语音能训练出AI大模型吗?就像训练会说话但不识字的人一样

AI语音对话技术通常是基于语音识别和自然语言处理&#xff08;NLP&#xff09;的。在这个过程中&#xff0c;语音首先被识别成文字&#xff0c;然后NLP技术对这些文字进行处理&#xff0c;生成回应。然而&#xff0c;我们是否可以直接训练一个“文盲”大模型&#xff0c;即只用…

45. UE5 RPG 增加角色受击反馈

在前面的文章中&#xff0c;我们实现了对敌人的属性的初始化&#xff0c;现在敌人也拥有的自己的属性值&#xff0c;技能击中敌人后&#xff0c;也能够实现血量的减少。 现在还需要的就是在技能击中敌人后&#xff0c;需要敌人进行一些击中反馈&#xff0c;比如敌人被技能击中后…

深度学习中的注意力机制二(Pytorch 16)

一 Bahdanau 注意力 通过设计一个 基于两个循环神经网络的编码器‐解码器架构&#xff0c;用于序列到序列学习。具体来说&#xff0c;循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量&#xff0c;然后循环神经网络 解码器根据生成的词元和上下文变量按词元生成…

meshlab: pymeshlab计算两个模型的布尔交集(mesh boolean intersection)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本案例以两个圆环为例。 左侧为两个圆环&#xff0c;右上是重叠&#xff0c;右下是圆…

引流源码短剧搜索前端源码+内附搜索API

引流源码短剧搜索前端源码内附搜索API&#xff0c;全网短剧搜索前端源码分享&#xff0c;文末附API及使用详解 内含7000短剧资源(不支持在线播放&#xff09;&#xff0c;毕竟搞在线播放挺烧钱的[阴险] 源码直接上传虚拟主机或服务器即可使用&#xff0c;无需其他配置&#x…

jvm 马士兵 01 JVM简介,class文件结构

01.JVM是什么 JVM是一个跨平台的标准 JVM只识别class文件&#xff0c;符合JVM规范的class文件都可以被识别 u1 是一个字节 u2是两个字节

使用网络用户命令行工具的/passwordreq:yes

提示:"新建域时&#xff0c;本地administrator帐户将成为域administrator账户。无法新建域&#xff0c;因为本地administrator账户密码不符合要求。 目前&#xff0c;本地administrator账户不需要密码。我们建议您使用网络用户命令行工具的/passwordreq:yes选项获得该账户…

AI图书推荐:ChatGPT在真实商业世界中的应用

《ChatGPT在真实商业世界中的应用》 (Unleashing The Power of ChatGPT: A Real World Business Applications)首先概述了ChatGPT及其在对话式人工智能领域的影响。接着&#xff0c;你将深入了解ChatGPT的技术方面&#xff0c;理解机器学习算法和自然语言处理如何在后台工作。然…

鸿蒙ArkTs开发,仿抖音个人中心header 下拉放大

如果是iOS 或者android 上实现&#xff0c;可以用Scollview 的contentOffset 来实现&#xff0c;然而在鸿蒙ets中该如何实现&#xff1f;废话不多说开始撸代码 第一步、实现一个header // 创建header&#xff0c;准备一张背景图片BuilderHeaderBuilder(){Column() {Row() {Ima…

社交媒体数据恢复:爱聊

爱聊数据恢复方法 在爱聊的使用过程中&#xff0c;如果遇到数据丢失的情况&#xff0c;可以尝试以下几种方法来恢复数据。 1. 硬盘坏道检测与修复 如果问题是由于硬盘坏道导致的&#xff0c;可以按照以下步骤进行操作&#xff1a; 找到需要修复的坏道磁盘&#xff1a;首先&…

js模块化:修改导入模块的内容,会有影响吗?

起因 element-ui的popper组件相关的层级&#xff0c;是使用popup-manager来统一管理的。 之前试图在自己的组件里导入并使用element-ui的popup-manager&#xff0c;但是层级老是和element-ui组件的层级冲突&#xff0c;看了下源码&#xff0c;竟意外发现&#xff0c;使用popu…

基于若依框架搭建网站的开发日志(一):若依框架搭建、启动、部署

RuoYi&#xff08;基于SpringBoot开发的轻量级Java快速开发框架&#xff09; 链接&#xff1a;开源地址 若依是一款开源的基于VueSpringCloud的微服务后台管理系统&#xff08;也有SpringBoot版本&#xff09;&#xff0c;集成了用户管理、权限管理、定时任务、前端表单生成等…

You don’t have permission.

The document “XXX” could not be saved. You don’t have permission. 1.查看修改了iOS系统库导致的, 根据提示, 进入到"XXX"文件中, 然后commandz回退/取消 2. Xcode 调试遇到的报错&#xff08;持续更新&#xff09;

治疗耳鸣患者案例分享第二期

“患者耳鸣20年了&#xff0c;目前耳朵没有堵或者胀的感觉&#xff0c;但是偶尔有点痒&#xff0c;平时会有头晕头胀这种情况&#xff0c;然后头晕是稍微晕炫一下。然后头疼是经常有的&#xff0c;头胀不经常。” 患者耳鸣持续20年&#xff0c;虽然耳朵没有堵或胀的感觉&#x…

书生浦语训练营第三次课笔记:XTuner 微调 LLM:1.8B、多模态、Agent

Finetune 简介 两种Finetune范式&#xff1a;增量预训练微调、指令跟随微调 微调数据集 上述是我们所期待模型回答的内容&#xff0c;在训练时损失的计算也是基于这个。 训练数据集看起来是这样&#xff0c;但是真正喂给模型的&#xff0c;是经过对话模板组装后的 下图中&…

防火墙的基本概念

我们在 TCP/IP协议四层模型与OSI七层模型 的最后说过&#xff0c;在四层模型中每一层都会有对应的风险&#xff0c;而防火墙就是来阻断这些风险的工具。 防火墙的基本功能 防火墙的分类 目前没有权威而明确的分类 按照实现方式&#xff1a; 硬件防火墙软件防火墙 按照部署…
最新文章