vue(九) 生命周期 v3.0和v2.0对比,父子组件生命周期的执行顺序

文章目录

  • 生命周期
  • vue2.0生命周期
    • 1.图示
    • 2.生命周期解释说明
    • 3.代码示例
  • vue3.0生命周期
    • 1.图示
    • 2.生命周期解释说明
    • 3.代码示例
  • 父子组件中生命周期执行顺序
  • v.3和v2.0生命周期对比


生命周期

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数,在特定阶段运行自己的代码。

vue2.0生命周期

1.图示

请添加图片描述

2.生命周期解释说明

vue2在第一次页面加载会触发beforeCreate created beforeMount mounted四个钩子函数,DOM渲染在mounted这个周期就已经完成

  1. **创建阶段:从创建Vue实例开始到模版渲染成HTML结束
    • beforeCreate:在实例被创建之初,完成数据观测和event/eventBus事件配置等初始化任务之前调用。
    • created:实例已经完成了数据观测等初始化任务,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。然而,挂载阶段还没开始,DOM元素并没有生成,且 $el property 目前尚不可用,无法访问。
    • beforeMount:在DOM挂载之前调用,在此期间可以对DOM进行处理,但还未能访问到DOM元素,相关的 render 函数首次被调用,此时是虚拟DOM。该钩子在服务器端渲染期间不被调用。
    • mounted:DOM挂载完成后调用,可以访问到DOM元素、实例属性和方法,并可以与后端请求数据和操作DOM。注意:mounted 不会保证所有的子组件也都被挂载完成。如果你希望等到整个视图都渲染完毕再执行某些操作,可以在 mounted 内部使用 vm.$nextTick
  2. 更新阶段: 当组件依赖的数据发生变化时,需要重新渲染组件,这个过程也涉及到一系列的生命周期函数
    • beforeUpdate:在数据发生改变后,DOM 被更新之前被调用。这里适合在现有 DOM 将要被更新之前访问它,比如移除手动添加的事件监听器。 注:该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务器端进行。
    • updated:在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用。

      当这个钩子被调用时,组件 DOM 已经更新,可以执行依赖于 DOM 的操作。
      然而在大多数情况下,应该避免在此期间更改状态。
      如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。
      注意:updated 不会保证所有的子组件也都被重新渲染完毕。如果你希望等到整个视图都渲染完毕,可以在 updated 里使用 vm.$nextTick

  3. 卸载阶段: 当组件不再需要的时候,需要进行卸载操作,也会触发一系列的生命周期函数:
    • beforeDestroy:在实例销毁之前调用。这个阶段可以进行一些清除工作,比如清除事件监听器或取消定时器。
    • destroyed:实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。
  4. **KeepAlives缓存生命周期:**当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。
    • deactivated 被 keep-alive 缓存的组件失活时调用。
    • activated 被 keep-alive 缓存的组件激活时调用。
  5. 组件中捕获错误周期: 当捕获一个来自子孙组件的异常时激活钩子函数。
    • errorCaptured:在捕获一个来自后代组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。

    可以在此钩子中修改组件的状态。
    因此在捕获错误时,在模板或渲染函数中有一个条件判断来绕过其它内容就很重要;不然该组件可能会进入一个无限的渲染循环。

3.代码示例

<template>
  <div>
    <h2>{{title}}</h2>
    <ul>
        <h3>{{num}}</h3>
        <button @click="num++">操作数据</button>
    </ul>
  </div>
</template>

<script>

export default {
  data() {
    return {
      title: "Hello Vue!",
      num:0
    };
  },
  
  methods:{
      show(){
          console.log('我是show方法');
      },
      
  },
  beforeCreate() {
    console.log("-------beforeCreate--------");
    /* 
      beforeCreate钩子函数在组件创建之前被调用,该函数被调用的时候,props,data,mehtods都没有被创建
      该组件的用处不是很大,但地位很高。
    */
    console.log("data", this.msg);
    //console.log('props',this.title);
    //this.show();
  },
  created(){
        console.log("-------created--------");
        /* 
          created钩子函数是在init Injections&Activitys之后被调用,此时已经完成props,data,methods的创建,所以在此处
          调用这些方法或方法
          模板或者DOM还没有被创建
          此钩子函数重要的用途是用来向服务端获取网络请求数据
          在此钩子函数之后的钩子中也能完成网络请求,但是一般都是在这里完成最佳
        */
      
        this.show();
       
  },
  beforeMount(){
    console.log('-------beforeMount--------');
    /* 
      该钩子函数之前的环节主要工作是将数据读取后填充到模板上,之后有读到内存中暂时存储
    */
   console.log('dom',document.querySelector('h2')); 
  },
  mounted(){
     console.log('-------mounted--------');
     console.log('dom',document.querySelector('h2'));
  },
  beforeUpdate(){
    console.log('---------beforeUpdate-----------');
    /* 
      beforeUpdate钩子函数中的特征
      数据已经变了
      但是页面还没来得及渲染
      数据是新的,而页面是旧的
    */
    console.log('data',this.num);
    console.log('dom',document.querySelector('h3').innerHTML);
  },
  updated(){
    console.log('---------updated-----------');
    console.log('data',this.num);
    console.log('dom',document.querySelector('h3').innerHTML);
  },
  beforeDestroy(){
    console.log('-----------beforeDestroy--------------');
    /* 
      此处是准备在销毁之前调用的钩子
      此处特征,数据props,data,methods都可以访问,但是DOM已经被移除了
    */
     console.log('data',this.num);
    // console.log('dom',document.querySelector('h3').innerHTML);
  },
  destroyed(){
     console.log('-----------destroyed--------------');
     console.log('data',this.num);
  }
};
</script>

<style>
</style>

vue3.0生命周期

1.图示

在这里插入图片描述

2.生命周期解释说明

  1. **创建阶段:**从创建Vue实例开始到模版渲染成HTML结束
    • setup() : 开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
    • onBeforeMount() : 注册一个钩子,在组件被挂载之前被调用。

      当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。

    • onMounted() 注册一个回调函数,在组件挂载完成后执行。通常用于执行需要访问组件所渲染的 DOM 树相关的副作用,或是在服务端渲染应用中用于确保 DOM 相关代码仅在客户端执行。

      被视为挂载完成

      1. 其所有同步子组件都已经被挂载 (不包含异步组件或 <Suspense> 树内的组件)。
      2. 其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。
  2. 更新阶段: 当组件依赖的数据发生变化时,需要重新渲染组件,这个过程也涉及到一系列的生命周期函数
    • onBeforeUpdate() : 注册一个钩子,在组件即将因为响应式状态变更而更新其 DOM 树之前调用。

      这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。

    • onUpdated() : 注册一个回调函数,在组件因为响应式状态变更而更新其 DOM 树之后调用。
      1. 父组件的更新钩子将在其子组件的更新钩子之后调用。
      2. 钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的,因为多个状态变更可以在同一个渲染周期中批量执行 (考虑到性能因素)。
        如果你需要在某个特定的状态更改后访问更新后的 DOM,请使用 nextTick() 作为替代。
      3. 注:不要在onUpdated钩子中更改组件的状态,这可能会导致无限的更新循环!
  3. 卸载阶段: 当组件不再需要的时候,需要进行卸载操作,也会触发一系列的生命周期函数:
    • onBeforeUnmount() : 注册一个钩子,在组件实例被卸载之前调用。当这个钩子被调用时,组件实例依然还保有全部的功能。
    • onUnmounted() : 注册一个回调函数,在组件实例被卸载之后调用。

      以下情况被视为已卸载

      1. 其所有子组件都已经被卸载。
      2. 所有相关的响应式作用 (渲染作用以及 setup() 时创建的计算属性和侦听器) 都已经停止。
        可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。
  4. KeepAlives缓存生命周期: 当组件实例从 DOM 上移除但因为被 <KeepAlive> 缓存而仍作为组件树的一部分时,它将变为不活跃状态而不是被卸载。当组件实例作为缓存树的一部分插入到 DOM 中时,它将重新被激活。
    • onActivated() : 注册一个回调函数,若组件实例是 <KeepAlive> 缓存树的一部分,当组件被插入到 DOM 中时调用。
    • onDeactivated() : 注册一个回调函数,若组件实例是 <KeepAlive> 缓存树的一部分,当组件从 DOM 中被移除时调用。

    注:onActivated 在组件挂载时也会调用,并且 onDeactivated 在组件卸载时也会调用。
    onActivated 和 onDeactivated 钩子不仅适用于 <KeepAlive> 缓存的根组件,也适用于缓存树中的后代组件。

  5. 捕获组件错误:
    • onErrorCaptured(): 注册一个钩子,在捕获了后代组件传递的错误时调用。

      捕获错误来源:

      1. 组件渲染
      2. 事件处理器
      3. 生命周期钩子
      4. setup() 函数
      5. 侦听器
      6. 自定义指令钩子
      7. 过渡钩子
        钩子带有三个实参:错误对象、触发该错误的组件实例,以及一个说明错误来源类型的信息字符串。
        可以在 errorCaptured() 中更改组件状态来为用户显示一个错误状态。
        注意不要让错误状态再次渲染导致本次错误的内容,否则组件会陷入无限循环。
        errorCaptured() 钩子可以通过返回 false 来阻止错误继续向上传递。
  6. 调试钩子函数:
    • onRenderTracked:每次渲染后重新收集响应式依赖

      注册一个调试钩子,当组件渲染过程中追踪到响应式依赖时调用。
      钩子仅在开发模式下可用,且在服务器端渲染期间不会被调用。

    • onRenderTriggered:每次触发页面重新渲染时自动执行

      注册一个调试钩子,当响应式依赖的变更触发了组件渲染时调用。
      钩子仅在开发模式下可用,且在服务器端渲染期间不会被调用。

  7. onServerPrefetch(): 注册一个异步函数,在组件实例在服务器上被渲染之前调用。

    如果这个钩子返回了一个 Promise,服务端渲染会在渲染该组件前等待该 Promise 完成。
    这个钩子仅会在服务端渲染中执行,可以用于执行一些仅存在于服务端的数据抓取过程。

    <script setup>
    import { ref, onServerPrefetch, onMounted } from 'vue'
    const data = ref(null)
    onServerPrefetch(async () => {
      // 组件作为初始请求的一部分被渲染
      // 在服务器上预抓取数据,因为它比在客户端上更快。
      data.value = await fetchOnServer(/* ... */)
    })
    
    onMounted(async () => {
      if (!data.value) {
        // 如果数据在挂载时为空值,这意味着该组件
        // 是在客户端动态渲染的。将转而执行
        // 另一个客户端侧的抓取请求
        data.value = await fetchOnClient(/* ... */)
      }
    })
    </script>
    

3.代码示例

<script>
import {
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted,
  ref
} from 'vue'
 
export default {
  setup () {
    // 其他的生命周期
    onBeforeMount (() => {
    console.log("App ===> 相当于 vue2.x 中 beforeMount")
    })
    onMounted (() => {
        console.log("App ===> 相当于 vue2.x 中 mounted")
    })
    
    // 注意,onBeforeUpdate 和 onUpdated 里面不要修改值
    onBeforeUpdate (() => {
        console.log("App ===> 相当于 vue2.x 中 beforeUpdate")
    })
    
    onUpdated (() => {
        console.log("App ===> 相当于 vue2.x 中 updated")
    })
    
    onBeforeUnmount (() => {
    console.log("App ===> 相当于 vue2.x 中 beforeDestroy")
    })
    
    onUnmounted (() => {
        console.log("App ===> 相当于 vue2.x 中 destroyed")
    })
   
    return {
    }
    
  }
}
</script>

父子组件中生命周期执行顺序

1、只有父组件时,页面组件一旦加载,生命周期及执行顺序
beforeCreate(创建前)
created(创建后)
beforeMount(载入前)
mounted(载入后)
2、存在父子组件时,页面组件一旦加载,生命周期及执行顺序
父组件:beforeCreate、created、beforeMount
子组件:beforeCreate、created、beforeMount、mounted
父组件:mounted

v.3和v2.0生命周期对比

v2.0生命周期v.3生命周期
beforeCreate (组件创建之前)setup(组件创建之前)
created(组件创建完成)setup(组件创建完成)
beforeMount (组件挂载之前)onBeforeMount(组件挂载之前)
mounted(组件挂载完成)onMounted(组件挂载完成)
beforeUpdate(数据更新,虚拟dom打补丁之前)onBeforeUpdate(数据更新,虚拟dom打补丁之前)
updated(数据更新,虚拟dom渲染完成)onUpdated(数据更新,虚拟dom渲染完成)
beforeDestroy(组件销毁之前)onBeforeUnmount(组件销毁之前)
destoryed(组件销毁之后)onUnmount(组件销毁之后)
  1. v2.0 注意

所有生命周期钩子的 this 上下文将自动绑定至实例中,因此你可以访问 data、computed 和 methods。这意味着你不应该使用箭头函数来定义一个生命周期方法 (例如 created: () => this.fetchTodos())
因为箭头函数绑定了父级上下文,所以 this 不会指向预期的组件实例,并且this.fetchTodos 将会是 undefined。

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

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

相关文章

2024年【电工(高级)】考试总结及电工(高级)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年电工&#xff08;高级&#xff09;考试总结为正在备考电工&#xff08;高级&#xff09;操作证的学员准备的理论考试专题&#xff0c;每个月更新的电工&#xff08;高级&#xff09;复审考试祝您顺利通过电工&a…

Git系列:git show 使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

OpenAI将最强人工智能拉入现实:GPT-4o情感交互颠覆认知——钢铁侠的“贾维斯”出生了,还是个女娃!

在科技飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的科幻概念&#xff0c;而是逐渐渗透进我们的日常生活。近期&#xff0c;OpenAI公司宣布推出其最新的人工智能模型GPT-4o&#xff0c;这一模型以其卓越的情感交互能力和高度的智能化水平&a…

SpringBoot+MybatisPlus实现读写分离,自动切换数据源

读写分离有必要吗&#xff1f; 实现读写分离势必要与你所做的项目相关&#xff0c;如果项目读多写少&#xff0c;那就可以设置读写分离&#xff0c;让“读”可以更快&#xff0c;因为你可以把你的“读”数据库的innodb设置为MyISAM引擎&#xff0c;让MySQL处理速度更快。 实现…

Kafka学习-Java使用Kafka

文章目录 前言一、Kafka1、什么是消息队列offset 2、高性能topicpartition 3、高扩展broker 4、高可用replicas、leader、follower 5、持久化和过期策略6、消费者组7、Zookeeper8、架构图 二、安装Zookeeper三、安装Kafka四、Java中使用Kafka1、引入依赖2、生产者3、消费者4、运…

Unity使用sherpa-onnx实现离线语音合成

sherpa-onnx https://github.com/k2-fsa/sherpa-onnx 相关dll和lib库拷进Unity&#xff0c;官方示例代码稍作修改 using SherpaOnnx; using System; using System.IO; using System.Runtime.InteropServices; using UnityEngine;public class TTS : MonoBehaviour {public st…

Google I/O 2024 干货全解读:Gemini AI 横空出世,智能未来触手可及!

Google I/O 2024 干货全解读&#xff1a;Gemini AI 横空出世&#xff0c;智能未来触手可及&#xff01; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》…

git 拉取指定目录

指令方式 打开 git 自带的Git Bash 工具 以拉取github中 fastjson 的 /src/test/java/oracle/sql/ 目录为例 1.创建文件夹和git 初始化 cd D:/Program\ Files mkdir fastjson cd fastjson git init 2.设置允许克隆子目录 git config core.sparsecheckout true 3.添加远程…

前端开发攻略---用代码带你走近双色球再到远离双色球

1、演示 2、玩法及规则 双色球是一种流行的彩票游戏&#xff0c;它在很多国家都有自己的版本。以下是双色球的详细玩法&#xff1a; 选择号码&#xff1a;玩家需要从1至33的红色球中选择6个号码&#xff0c;并且从1至16的蓝色球中选择1个号码&#xff0c;构成一组7个号码。 购…

使用make_blobs生成数据并使用KNN机器学习算法进行分类和预测以及可视化

生成数据 使用make_blobs生成数据并使用matplotlib进行可视化 完整代码&#xff1a; from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklea…

Linux 第三十一章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

力扣127.单词接龙讲解

距离上一次刷题已经过去了.........嗯............我数一一下............整整十天&#xff0c;今天再来解一道算法题 由于这段时间准备简历&#xff0c;没咋写博客。。今天回来了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

【二叉树】(二)二叉树的基础修改构造及属性求解1

&#xff08;二&#xff09;二叉树的基础修改构造及属性求解1 翻转二叉树递归实现迭代实现&#xff08;深度遍历&#xff09;层序实现&#xff08;广度遍历&#xff09; 对称二叉树递归实现迭代实现&#xff08;非层序遍历&#xff09; 二叉树的最大深度递归法迭代法&#xff0…

你了解黑龙江等保测评么?

等保测评的全称是信息安全等级保护测评&#xff0c;是信息安全等级保护工作中的一项重要内容。 具体来说&#xff0c;等保测评是指按照国家相关标准和技术规范&#xff0c;对信息系统安全等级保护状况进行检测评估的活动。 其主要目的是发现信息系统存在的安全隐患和不足&…

学会给文件夹加密,保密措施不可或缺!

我们的个人信息、工作文件和其他重要数据都存储在各种设备和文件夹中&#xff0c;如何保证这些数据的安全&#xff0c;防止未经授权的访问和泄露&#xff0c;成为了一个不容忽视的问题。本文将探讨给文件夹加密的必要性&#xff0c;以及如何在手机和电脑上进行文件夹加密。 操作…

使用KNN预测一个新的点,以及将这个点用五角星进行matplotlib可视化展示

概述 基于之前的KNN案例继续做一些操作。 之前的完整代码如下&#xff1a; from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklearn.model_…

DiskGenius帮你恢复系统无法识别的U盘数据

场景还原 前两天早上U盘复制文件卡死后&#xff0c;强行断开U盘&#xff0c;再次使用直接无法访问&#xff0c;心拔凉拔凉&#xff01;&#xff01; 使用驱动器G:中的光盘之前需要将其格式化 位置不可用-无法访问U盘 常规科普 一、U盘无法识别 1、检查U盘是否插入正确&…

【汇编语言】多文件组织

【汇编语言】多文件组织 文章目录 【汇编语言】多文件组织前言一、8086拓展1.子程序的另外一种写法2.程序的多文件组织 总结 前言 本篇文章将讲到子程序的另一种写法&#xff0c;以及程序的多文件组织。 一、8086拓展 1.子程序的另外一种写法 初始的程序 在这里我们对比一下…

6款电脑精选工具软件推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1.IP地址查看工具——纯真ip数据库 纯真IP数据库是一个易于操作的IP地址查询工具&#xff0c;它允许用户通过输入IP地址来查询其对应的地理位置…

每天五分钟玩转深度学习pytorch:pytorch中的张量类型

本文重点 和numpy一样,pytorch中也有自己的类型,本节课程我们将对它的类型进行介绍,并且学习不同的类型之间的转换,这是pytorch的基础。 基本类型 pytorch的基本变量称为张量Tensor,这张表是pytorch中的类型,Tensor有不同的类型,他和很多编程语言中的类型相似,它有 32…