【Vue】绝了!这生命周期流程真...

hello,我是小索奇,精心制作的Vue系列持续发放,涵盖大量的经验和示例,如果对您有用,可以点赞收藏哈~

生命周期

Vue.js 组件生命周期:

生命周期函数(钩子)就是给我们提供了一些特定的时刻,让我们可以在这个周期段内加入自己的代码,做一些需要的事情;

生命周期钩子中的this指向是VM 或 组件实例对象

在JS 中,函数的执行上下文(也就是函数内部的 this 指向的对象)取决于函数的调用方式而 Vue 在创建组件实例时,会在内部确保生命周期钩子函数的执行上下文是指向组件实例的

具体来说,当 Vue 创建一个组件实例时,它会使用JS 的 Function.prototype.bind 方法来绑定组件实例作为函数内部的 this这意味着无论在哪个生命周期钩子函数中,我们使用的 this 都会指向当前组件实例

Vue 实例生命周期

image-20230829104559179

  • 初始化:

    • Events & Lifecycle:初始化生命周期、事件,数据代理尚未开始(beforeCreate前)
    • Injections & reactivity:初始化数据监测、数据代理,(beforeCreate实例创建后)
  • 创建阶段:

    • beforeCreate: 在数据监测、数据代理注入之前,在这个阶段初始化生命周期、事件,但数据代理还未开始注入

      数据代理:Vue 会将组件实例上的数据(data)、计算属性(computed)、方法(methods)等代理到实例本身上,在beforeCreate阶段使得我们可以通过 this 访问到vm,我们不能通过 this 直接访问 data 中的数据和 methods 中的方法

      数据监测:Vue 开始进行数据的响应式监测,即开始追踪数据的变化以便在数据变化时更新视图。

    • created: 数据监测、数据代理都已完成,数据监测确保了数据的变化能够被 Vue 追踪和响应。此时,我们可以在组件内部通过 this 访问并操作已经初始化的 data 和 methods,但组件尚未挂载到 DOM

  • 挂载阶段:

    • beforeMount: 组件挂载前调用,这时候操作不了真实DOM
    • mounted: 组件挂载到 DOM 后,此时页面呈现的是经过编译的真实DOM,可以进行 DOM 操作和初始化,但是尽量不要更改,刚挂载完成就给人家更改了?一般在此阶段开启定时器、发送网络清求、订阅消息、绑定自定义事件等初始化操作
  • 更新阶段:

    • beforeUpdate: 数据更新前调用,可做准备工作
    • updated: 数据更新完成,DOM 重新渲染避免修改数据以防止循环
  • 销毁阶段:

    • beforeDestroy: 在组件即将销毁(卸载)之前触发。这是一个很好的时机来进行一些清理工作,例如取消订阅、清除定时器、解绑事件监听器等。在这个阶段,组件仍然处于活动状态,可以访问组件的数据和方法。一旦 beforeDestroy 钩子执行完毕,组件就会被销毁,无法再通过实例访问组件的属性或方法。

    • destroyed: destroyed 生命周期钩子在组件已经销毁(卸载)之后触发。在这个阶段,组件实例以及其所有相关的 DOM 已经被完全销毁。我们可以在这个钩子中做一些清理工作,例如释放组件占用的资源、解绑全局事件监听器等。与 beforeDestroy 不同,此时无法访问组件的数据和方法,因为组件实例已经被销毁

      在destoryed这个阶段一般什么都不做,在react中没有这个阶段

  • 其他钩子:

    • activated(仅用于 keep-alive 组件):组件激活时调用
    • deactivated(仅用于 keep-alive 组件):组件停用时调用
    • errorCaptured: 捕获组件内部错误,类似于 try-catch

下面具体说明一下细节

测试时候记得配合debugger开控制台刷新使用,否则一下子执行完生命周期了:

// data中定义了number:666
beforeCreate() {console.log('实例创建前')console.log(this)debugger}

Vue实例中number为undefined

image-20230829105905696

下图中template和Outer 指的是哪?

image-20230827234808378

  • OuterHTML:指的就是外面绿色框框内的,div都会作为模板进行解析

  • InnerHTML:在内部的也就是InnerHTML

image-20230827231533273

  • 不进行 outer 的初始化操作可能会导致我们无法获得正确的 outerHTML 值,这个没多大影响

编译模板到渲染函数内:当我们把上述整个div清除时,就会尝试编译template作为模板进行解析,template将其完全替代渲染到页面上

created之后,beforeMounted之前,这一个阶段Vue开始解析模板,在内存中生成虚拟DOM,页面已经解析完了,但是还没有显示到页面上

image-20230828005007892

image-20230828001649675

  • beforeMount此时呈现的是未经编译的DOM结构,是不能够操作真实DOM的,所有对DOM的操作最终都不生效,控制台更改瞬时生效,执行完$el 替换之后,还是把虚拟DOM拿过来瞬间生成真实DOM插入页面(虚拟DOM是在created之后,beforeMount之前生成的虚拟DOM,所以在beforeMount这时怎么修改也只是瞬间生效)

设上端点,在页面上操作进行DOM,可以发现页面的确显示了(没有断点,根本不会看到任何变化)

image-20230828222709046

一旦点击下一步页面立即回复原样,说明了此时不能操作DOM

image-20230828223823930

  • Created VM.$el and replace "el" with it 这里用$el替换整个el容器的东西,这一步内存中的虚拟DOM转换成真实DOM,并且在VM.$el上进行存储
  • mounted此时页面呈现的是经过编译的真实DOM,可以进行 DOM 操作和初始化,但是尽量不要更改,刚挂载完成就给人家更改了?一般在此阶段开启定时器、发送网络清求、订阅消息、绑定自定义事件等初始化操作

image-20230827233721850

页面和数据尚未保持同步的是哪一个阶段?

是在beforeUpdate这个阶段,此时数据是新的,页面时旧的

image-20230828000924112

这里定义了number=“666”,可以看到控制台已经更新了667,页面尚未刷新

image-20230828001332886

之后就不断根据新数据生成新DOM,并与旧DOM对比,最终完成页面更新;

Model->View 数据绑定的更新

在每次数据变化触发更新时,Vue 会创建一个新的虚拟 DOM,然后将新的虚拟 DOM 与之前的虚拟 DOM 进行比较,找出差异,然后将这些差异应用于真实 DOM

image-20230828002451008

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

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

相关文章

Net6.0或Net7.0项目升级到Net8.0 并 消除.Net8中SqlSugar的警告

本文基于NetCore3.1或Net6.0项目升级到Net7.0,参考连接:NetCore3.1或Net6.0项目升级到Net7.0-CSDN博客 所有项目按照此步骤操作一遍,完成后再将所有引用的包(即 *.dll)更新升级到最新版(注意:有…

Spark---资源、任务调度

一、Spark资源调度源码 1、Spark资源调度源码过程 Spark资源调度源码是在Driver启动之后注册Application完成后开始的。Spark资源调度主要就是Spark集群如何给当前提交的Spark application在Worker资源节点上划分资源。Spark资源调度源码在Master.scala类中的schedule()中进行…

leetCode 17.电话号码的字母组合 + 回溯算法 + 图解 + 笔记

17. 电话号码的字母组合 - 力扣(LeetCode) 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1&…

类指针压缩空间

一、类指针压缩介绍 压缩指针,指的是在 64 位的机器上,使用 32 位的指针来访问数据(堆中的对象或 Metaspace 中的元数据)的一种方式。 对象头中的 Class Pointer 默认占 8 个字节,开启 -XX:UseCompressedOops 后&…

文本生成超逼真歌曲,谷歌推出音乐模型Lyria

转换示例 谷歌旗下的DeepMind与视频平台YT合作,发布了目前最先进的音乐模型——Lyria。 为了突破传统音乐模型的生硬机器感,谷歌汇集了多个部门并与Charlie Puth、T-Pain、Troye Sivan等9位知名音乐人共同研发了Lyria。 Lyria可生成爵士、重金属、摇滚…

每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题

每日一题系列(day 07) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

在centos7上源码安装nginx

1. 安装必要的编译工具和依赖项 在编译Nginx之前,你需要安装一些编译工具和依赖项。可以通过以下命令安装: yum install gcc-c pcre-devel zlib-devel make 2. 下载Nginx源代码 从Nginx官网下载最新的源代码。你可以使用wget命令来下载: …

正则表达式及文本三剑客grep,awk,sed

目录 正则表达式 前瞻 代表字符 表示次数 位置锚定 分组或其他 grep 选项 范例 awk 前瞻 awk常见的内置变量 范例 sed 前瞻 sed格式 范例 搜索替代 格式 范例 分组后项引用 格式 范例 正则表达式 前瞻 通配符:匹配的是文件名 正则表达式&a…

【读论文】【泛读】S-NERF: NEURAL RADIANCE FIELDS FOR STREET VIEWS

文章目录 0. Abstract1. Introduction2. Related work3. Methods-NERF FOR STREET VIEWS3.1 CAMERA POSE PROCESSING3.2 REPRESENTATION OF STREET SCENES3.3 DEPTH SUPERVISION3.4 Loss function 4. EXPERIMENTS5. ConclusionReference 0. Abstract Problem introduction&…

REST-Assured--JAVA REST服务自动化测试的Swiss Army Knife

什么是REST-Assured REST Assured是一套基于 Java 语言实现的开源 REST API 测试框架 Testing and validation of REST services in Java is harder than in dynamic languages such as Ruby and Groovy. REST Assured brings the simplicity of using these languages into t…

【深入解析git和gdb:版本控制与调试利器的终极指南】

【本节目标】 1. 掌握简单gdb使用于调试 2. 学习 git 命令行的简单操作, 能够将代码上传到 Github 上 1.Linux调试器-gdb使用 1.1.背景 程序的发布方式有两种,debug模式和release模式release模式不可被调试,debug模式可被调试Linux gcc/g出来的二进制…

kali linux nmap 端口扫描 简单教程

本次实验所用工具如下: VMwarekali linux (namp扫描工具)Windows sever 2016 需开启(FTP,smp,Telnet,rdp)端口namp操作所用部分代码: -sP ping 扫描 -P 指定端口范围 -sV 服务版本探测 -A …