Vue.js 生命周期详解:从创建到销毁的全过程

  💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。



非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
 

前言

在前端开发的世界里,Vue.js 因其简洁的 API 和高效的数据绑定特性而广受欢迎。Vue 实例的生命周期是 Vue.js 开发中的一个核心概念,它描述了从 Vue 实例的创建到销毁的整个过程。在这篇博客中,我将深入探讨 Vue 的生命周期,并通过示例代码展示如何在不同的生命周期钩子中执行代码,从而帮助大家在开发中更好地利用 Vue 的功能。

1. Vue 生命周期概述

Vue 实例的生命周期可以分为四个主要阶段:创建阶段挂载阶段更新阶段销毁阶段。每个阶段都伴随着特定的生命周期钩子,允许开发者在特定的时间点执行代码。

生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁

1.创建阶段:创建响应式数据

在创建阶段,Vue 实例被初始化,数据观测(reactive data observation)开始,但模板还未挂载,也未渲染到页面上。这个阶段有两个主要的生命周期钩子:

  • beforeCreate:在这个阶段,实例刚刚被初始化,数据观测和事件/侦听器的配置都还未开始。此时,你无法访问数据、计算属性、方法或监听器等。
  • created:在这个阶段,实例已完成数据观测、属性和方法的运算、watch/event 事件回调的配置。然而,挂载阶段还没开始,$el 属性目前不可见。这通常是你执行异步数据请求的最佳时机。
  • 代码:
    beforeCreate() {  console.log('beforeCreate 响应式数据准备好之前', this.count); // 输出:undefined  
    },  
    created() {  console.log('created 响应式数据准备好之后', this.count); // 输出:100  // 这里可以发起数据请求  
    },

2.挂载阶段:渲染模板

在挂载阶段,Vue 实例的模板被渲染到页面上,实例成为 DOM 树的一部分。这个阶段也有两个生命周期钩子:

  • beforeMount:在挂载开始之前被调用,相关的 render 函数首次被调用。此时模板编译完成,但尚未替换挂载点上的 HTML,所以此时页面上仍然显示的是旧的 DOM。
  • mounted:在 el 被新创建的 vm.el替换,并挂载到实例上去之后调用该钩子。如果根实例挂载了文档内元素,当mounted被调用时vm.el 也在文档内。这意味着你可以安全地操作 DOM 了。
beforeMount() {  console.log('beforeMount 模板渲染之前', document.querySelector('h3').innerHTML); // 输出:{{ title }}  
},  
mounted() {  console.log('mounted 模板渲染之后', document.querySelector('h3').innerHTML); // 输出:计数器  // 此时可以操作 DOM  
},

3.更新阶段:修改数据,更新视图

当 Vue 实例的数据变化时,Vue 将重新渲染 DOM 以匹配最新的数据。这个过程中也有两个生命周期钩子:

  • beforeUpdate:数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
  • updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用这个钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。但要避免更改状态,因为这可能会导致无限更新循环。
beforeUpdate() {  console.log('beforeUpdate 数据修改了,视图还没更新', document.querySelector('span').innerHTML); // 输出:100  
},  
updated() {  console.log('updated 数据修改了,视图已经更新', document.querySelector('span').innerHTML); // 更新后的数据  
},

4.销毁阶段:销毁Vue实例

在 Vue 实例销毁的过程中,会调用两个生命周期钩子:

  • beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
  • destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

beforeDestroy() {  console.log('beforeDestroy, 卸载前');  // 清除定时器、事件监听器等  
},  
destroyed() {  console.log('destroyed,卸载后');  
},

2. Vue生命周期钩子

Vue生命周期过程中,会自动运行一些函数,被称为【生命周期钩子】→ 让开发者可以在【特定阶段】运行自己的代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><h3>{{ title }}</h3><div><button @click="count--">-</button><span>{{ count }}</span><button @click="count++">+</button></div></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {count: 100,title: '计数器'},// 1. 创建阶段(准备数据)beforeCreate () {console.log('beforeCreate 响应式数据准备好之前', this.count)},created () {console.log('created 响应式数据准备好之后', this.count)// this.数据名 = 请求回来的数据// 可以开始发送初始化渲染的请求了},// 2. 挂载阶段(渲染模板)beforeMount () {console.log('beforeMount 模板渲染之前', document.querySelector('h3').innerHTML)},mounted () {console.log('mounted 模板渲染之后', document.querySelector('h3').innerHTML)// 可以开始操作dom了},// 3. 更新阶段(修改数据 → 更新视图)beforeUpdate () {console.log('beforeUpdate 数据修改了,视图还没更新', document.querySelector('span').innerHTML)},updated () {console.log('updated 数据修改了,视图已经更新', document.querySelector('span').innerHTML)},// 4. 卸载阶段beforeDestroy () {console.log('beforeDestroy, 卸载前')console.log('清除掉一些Vue以外的资源占用,定时器,延时器...')},destroyed () {console.log('destroyed,卸载后')}})</script>
</body>
</html>

总结

Vue.js 的生命周期为开发者提供了在不同阶段执行代码的机会,从而让我们能够更灵活地控制 Vue 实例的行为。通过合理利用生命周期钩子,我们可以更好地组织代码,提高应用的性能和可维护性。希望这篇博客能帮助你更好地理解 Vue 的生命周期,并在实际开发中灵活运用

❤️❤️❤️小郑是普通学生水平,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BUG】已解决:java.lang.reflect.InvocationTargetException

已解决&#xff1a;java.lang.reflect.InvocationTargetException 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发…

STM32 IAP 需要关注的一些事

1、首先要知道STM32的程序是如何分布在FLASH中的。 2、升级的时候涉及到两个程序&#xff0c;一个是bootloader&#xff0c;一个是user程序&#xff0c;这两个程序的功能分别的什么作用的&#xff1f; 3、编译的固件是怎么分布的&#xff1f;通过那个配置文件去指导编译器去排布…

Spring Boot集成kudu快速入门Demo

1.什么是kudu 在Kudu出现前&#xff0c;由于传统存储系统的局限性&#xff0c;对于数据的快速输入和分析还没有一个完美的解决方案&#xff0c;要么以缓慢的数据输入为代价实现快速分析&#xff0c;要么以缓慢的分析为代价实现数据快速输入。随着快速输入和分析场景越来越多&a…

网络爬虫基础介绍

什么是爬虫 Web 爬虫&#xff0c;也称为网络蜘蛛或网络机器人&#xff0c;是一种用于自动化访问和抓取网页内容的程序。爬虫通过模拟用户访问网页的行为&#xff0c;从互联网上获取数据&#xff0c;并将其存储或进一步处理。 爬虫的应用场景 搜索引擎索引&#xff1a;如 Google…

十五、【机器学习】【监督学习】- 神经网络回归

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

C语言强化-1.数据结构概述

与408的关联&#xff1a;1. 逻辑结构和存储结构在选择题中会有涉及。2. 时间复杂度几乎是每一年大题必考内容&#xff01; 逻辑结构与存储结构 逻辑结构&#xff08;对人友好&#xff09; 集合结构&#xff08;无关系&#xff09;线性结构&#xff08;一对一&#xff09;树形…

Django Q()函数

Q() 函数的作用 在Django中&#xff0c;Q()函数是一个非常有用的工具&#xff0c;主要用于构建复杂的查询。它允许你创建复杂的查询语句&#xff0c;包括AND、OR和NOT逻辑操作。这对于处理复杂的数据库查询特别有用&#xff0c;特别是在你需要组合多个条件或处理复杂的过滤逻辑…

HLS加密技术:保障流媒体内容安全的利器

随着网络视频内容的爆炸性增长&#xff0c;如何有效保护视频内容的版权和安全成为了一个亟待解决的问题。HLS&#xff08;HTTP Live Streaming&#xff09;加密技术作为一种先进的流媒体加密手段&#xff0c;凭借其高效性和安全性&#xff0c;在直播、点播等场景中得到了广泛应…

【Neo4j 】学习笔记:GraphRAG 宣言:为 GenAI 添加知识

GraphRAG 宣言:为 GenAI 添加知识 原文 菲利普拉瑟尔图片 菲利普拉瑟尔 7 月 11 日 阅读时长:22 分钟 我们正在进入 RAG 的“Blue Links”时代 GraphRAG 宣言。 我们即将意识到,要想用 GenAI 做任何有意义的事情,你不能只依赖自回归 LLM来做决定。我知道你在想什么:“RAG …

【C语言】联合体(union)

文章目录 1.联合体的含义2. 联合体的声明3. 联合体大小的计算4. 联合体的特点 1.联合体的含义 联合体也叫做共用体&#xff0c;是指联合体的所有成员共用同一块内存空间。这也就说明了&#xff0c;联合体的大小至少是其成员所占空间的最大值。 2. 联合体的声明 #include<…

【整体介绍】HTML和JS编写多用户VR应用程序的框架

一、Networked-Aframe是什么&#xff1f; 简称NAF&#xff0c;底层基于Mozilla的AFrame框架&#xff0c;用HTML和JS编写多用户VR应用程序的框架。 二、特性 支持 WebRTC 和/或 WebSocket 连接。 语音聊天。音频流让您的用户在应用程序内交谈&#xff08;仅限 WebRTC&#xff…

2024全球和国内最常用的弱密码,有没有你的?

密码管理器NordPass分析了来自公开来源的超过4.3TB 的密码数据&#xff0c;找出了当前为止&#xff08;2024年&#xff09;最常用&#xff08;最脆弱&#xff09;的密码。 这些密码主要有下面这些特征&#xff1a; 简单且常用&#xff0c;万年弱密码&#xff0c;比如123456、a…

数据仓库实践:了解和定义指标

指标分类 指标分类主要分为原子指标、派生指标、衍生指标 原子指标 某一业务事件下的度量&#xff0c;是不可再拆分的值&#xff0c;这些值一般有明确业务含义的名称&#xff0c;如库存数量、人员数量; 度量&#xff1a;在维度建模中&#xff0c;将度量称为事实&#xff0c;…

智慧消防建设方案(完整方案参考PPT)

智慧消防系统建设方案旨在通过物联网、大数据与云计算技术&#xff0c;集成火灾自动报警、智能监控、应急指挥等功能于一体。方案部署智能传感器监测火情&#xff0c;实时数据分析预警&#xff0c;实现火灾早发现、早处置。构建可视化指挥平台&#xff0c;优化应急预案&#xf…

Python中发送邮件的艺术:普通邮件、PDF附件与Markdown附件

用的是qq邮箱,具体获取smtp的password可以看这个文章 获取密码 Python中发送邮件的艺术:普通邮件、PDF附件与Markdown附件 在今天的博客中,我们将探讨如何使用Python的smtplib库来发送电子邮件,包括发送普通文本邮件、携带PDF文件的邮件和附带Markdown文件的邮件。这些功能…

视频号助手获取feedId

1.登陆视频号 2.内容管理-视频 3.视频后分享

Java实习记录 1 ——初入职场

Java实习记录 1 ——初入职场 引言正文收获 引言 在几个月的春招过程中&#xff0c;在完成学校学业的同时&#xff0c;进行投简历、笔试和面试。得益于较为扎实的技术基础&#xff0c;在暑假来临之际&#xff0c;找到了第一份实习工作。目前已入职将近半个月。记录一下实习经历…

码农生涯问题杂记

Linux GCC编译通过&#xff0c;Vistual Studio编译报莫名奇妙错误 Q&#xff1a;工作中需要测试一个JNA程序&#xff0c;想着Windows方便&#xff0c;所以就在Windows进行动态库的编译&#xff0c;然后在编译过程中&#xff0c;对应的代码在Linux系统GCC编译是成功的&#xff…

前端面试题日常练-day94 【Less】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 在Less中&#xff0c;以下哪个功能用于处理文本换行&#xff1f; a) wrap-text() b) word-wrap() c) text-wrap() d) line-break() Less中的Variables是用来做什么的&#xff1f; a) 控制元素位置 b)…

Git 用法

基本介绍 版本控制工具用处&#xff1a; 备份代码还原协同开发追溯 版本控制工具 1、集中式版本控制工具 版本库是集中存放在中央服务器的&#xff0c;team 里每个人 work 时从中央服务器下载代码&#xff0c;是必须联网才能工作&#xff0c;局域网或互联网。个人修改后然后…