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

news2024/9/20 9:32:45

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



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

前言

在前端开发的世界里,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.coloradmin.cn/o/1933629.html

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

相关文章

leetcode_189. 轮转数组

leetcode_189. 轮转数组 题目描述: 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,…

炎炎夏日 凉凉机房

夏季高温即将到来&#xff0c;温度过高&#xff0c;电梯故障频发。机房温控方式除了加装空调之外&#xff0c;您还知道其他的方式吗&#xff1f; 小伍告诉您一个小妙招&#xff1a;为电梯加装节能设备&#xff0c;小小机器大大能量。 通常电梯在轻载上行&#xff0c;重载下行和…

全国数据智能与智慧政务行业产教融合共同体学术年会暨广东行政职业学院(广东青年职业学院)第一届“求是论坛”成功举办

为进一步深化现代职业教育体系建设理论研究&#xff0c;丰富行业产教融合共同体实践探索&#xff0c;7月13日&#xff0c;全国数据智能与智慧政务行业产教融合共同体学术年会暨广东行政职业学院&#xff08;广东青年职业学院&#xff09;第一届“求是论坛”在广东行政职业学院&…

Apache Paimon 在蚂蚁的应用

摘要 &#xff1a;本文整理自 Apache Paimon Committer 闵文俊老师在5月16日 Streaming Lakehouse Meetup Online 上的分享。内容主要分为以下四个部分&#xff1a; 什么是 Paimon蚂蚁 Paimon 应用场景蚂蚁 Paimon 功能改进未来规划 一、什么是 Paimon 1. 实时更新 Paimon 是…

U盘文件夹失踪?两大数据恢复策略全解析

在数字化信息爆炸的今天&#xff0c;U盘作为我们日常工作中不可或缺的存储工具&#xff0c;承载着大量重要数据和文件。然而&#xff0c;当您突然发现U盘中的一个重要文件夹神秘消失时&#xff0c;那份焦急与无助感油然而生。本文旨在深入探讨U盘文件夹失踪的原因&#xff0c;并…

Linux安装mysql(超详细版)

步骤1&#xff1a;新建一个文件夹&#xff0c;专放从网络下载的文件 [rootiZ2zeh6vyxsq620zifz8jaZ home]#mkdir soft #在根目录下创建也可以 步骤2&#xff1a;切换目录&#xff0c;进入soft文件中 [rootiZ2zeh6vyxsq620zifz8jaZ /]# cd home/ #若第一步文件建在根目…

15- 微分方程

对三角函数不敏感

24暑假算法刷题 | Day15 | LeetCode 110. 平衡二叉树,257. 二叉树的所有路径,404. 左叶子之和,222. 完全二叉树的节点个数

目录 110. 平衡二叉树题目描述题解 257. 二叉树的所有路径题目描述题解 404. 左叶子之和题目描述题解 222. 完全二叉树的节点个数题目描述题解 110. 平衡二叉树 点此跳转题目链接 题目描述 给定一个二叉树&#xff0c;判断它是否是平衡二叉树 平衡二叉树 是指该树所有节点的…

AI算法16-贝叶斯线性回归算法Bayesian Linear Regression | BLR

贝叶斯线性回归算法简介 频率主义线性回归概述 线性回归的频率主义观点可能你已经学过了&#xff1a;该模型假定因变量&#xff08;y&#xff09;是权重乘以一组自变量&#xff08;x&#xff09;的线性组合。完整的公式还包含一个误差项以解释随机采样噪声。如有两个自变量时…

原码、补码、反码、移码是什么?

计算机很多术语翻译成中文之后&#xff0c;不知道是译者出于什么目的&#xff0c;往往将其翻译成一个很难懂的名词。 奇怪的数学定义 下面是关于原码的“吐槽”&#xff0c;可以当作扩展。你可以不看&#xff0c;直接去下一章&#xff0c;没有任何影响。 原码的吐槽放在前面是…

【元器件】二极管、三极管、MOS管

二极管 D 二极管是一种具有两个电极&#xff08;即正极和负极&#xff09;的电子器件。它是一种非线性元件&#xff0c;具有许多重要的功能和应用 三极管 Q 概述 一种控制电流的半导体器件&#xff0c;其作用是把微弱信号放大成幅度值较大的电信号&#xff0c;也用作无触点开…

代理IP服务中的代理池大小有何影响?

在当今数字化时代&#xff0c;网络爬虫已经成为获取各类信息必不可少的工具。在大规模数据抓取中&#xff0c;使用单一 IP 地址或同一 IP 代理往往会面临抓取可靠性降低、地理位置受限、请求次数受限等一系列问题。为了克服这些问题&#xff0c;构建代理池成为一种有效的解决方…

TikTok账号矩阵运营怎么做?

这几年&#xff0c;聊到出海避不过海外抖音&#xff0c;也就是TikTok&#xff0c;聊到TikTok电商直播就离不开账号矩阵&#xff1b; 在TikTok上&#xff0c;矩阵养号已经成为了出海电商人的流行策略&#xff0c;归根结底还是因为矩阵养号可以用最小的力&#xff0c;获得更大的…

沧穹科技助力杭州东站网约车服务全面升级

沧穹科技助力杭州东站完成网约车智能化服务全面革新升级&#xff0c;这一举措显著提升了杭州东站网约车服务的效率与乘客体验。以下是对这一革新升级的详细解析&#xff1a; 一、革新背景 随着网约车行业的快速发展&#xff0c;杭州东站作为华东地区重要的交通枢纽&#xff0c;…

VRRP虚拟路由冗余技术

VRRP虚拟路由冗余技术&#xff1a;是一种路由容错协议&#xff0c;用于在网络中提供路由器的冗余备份。它通过将多个路由器虚拟成一个虚拟路由器并且多个路由器之间共享一个虚拟IP地址来实现冗余和高可用性。当承担转发业务的主路由器出现故障时&#xff0c;其他备份路由器可以…

输出调节求解跟踪问题(二阶线性系统)

本文研究了一种基于增广系统的领导者-跟随者控制框架&#xff0c;旨在实现跟随者系统对领导者参考信号的精确跟踪。首先&#xff0c;建立了跟随者和领导者的独立状态空间方程&#xff0c;分别描述了它们的动态行为和输出关系。随后&#xff0c;通过将两者的状态空间方程结合成增…

AI口语练习APP的技术挑战

实现基于大模型的口语练习系统是一项复杂且具有挑战性的任务&#xff0c;涉及多项技术和工程难点。以下是一些主要的技术难点。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 语音识别准确率 口语练习APP需要能够准确识别用户的语…

探索Python自然语言处理的新篇章:jionlp库介绍

探索Python自然语言处理的新篇章&#xff1a;jionlp库介绍 1. 背景&#xff1a;为什么选择jionlp&#xff1f; 在Python的生态中&#xff0c;自然语言处理&#xff08;NLP&#xff09;是一个活跃且不断发展的领域。jionlp是一个专注于中文自然语言处理的库&#xff0c;它提供了…

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

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

Google资深工程师深度讲解Go语言-课程笔记

课程目录&#xff1a; 第1章 课程介绍 欢迎大家来到深度讲解Go语言的课堂。本课程将从基本语法讲起&#xff0c;逐渐深入&#xff0c;帮助同学深度理解Go语言面向接口&#xff0c;函数式编程&#xff0c;错误处理&#xff0c;测试&#xff0c;并行计算等元素&#xff0c;并带…