vue源码分析(十)—— 生命周期

文章目录

  • 前言
  • 一、关键方法 callHook
  • 二、详细的钩子函数说明
    • 1.beforeCreate和create
    • 2.beforeMount & mounted
      • 注意点
      • 组件(非根组件)的渲染节点
        • (1)invokeInsertHook函数
        • (2)insert方法
        • (3)insert方法说明
    • 3.beforeUpdate & updated
      • (1)beforeUpdate 的执行时机是在渲染 Watcher 的 before 函数中
      • (2)update 的执行时机在flushSchedulerQueue 函数调用
      • (3)问题:为什么在 callUpdatedHooks 函数中,只有 vm._watcher 的回调执行完毕后,才会执行 updated 钩子函数
    • 4.beforeDestroy & destroyed
  • 总结


前言

生命周期就不过多说明了。主要是讲背的八股文通过源码来解释,为什么不同的钩子函数有不同的效果
附上生命周期的流程图,如下或点击官网查看:vue2官网生命周期流程图
在这里插入图片描述


一、关键方法 callHook

方法路径:src\core\instance\lifecycle.ts

在这里插入图片描述

二、详细的钩子函数说明

1.beforeCreate和create

路径: src\core\instance\init.ts

beforeCreate和create 初始化前后,其实是在初始化函数中执行初始化数据的前后,也就是data method computed watch等属性。

在这里插入图片描述

2.beforeMount & mounted

路径: src\core\instance\init.ts

beforeMount & mounted 挂载前后,挂载前后其实就是生成了所有的虚拟DOM。
(挂载的含义:描述dom的数据需要整理,其实就是一堆(虚拟dom)对象储存了一堆数据,然后这些数据用js的API,比如createElement,创造出dom,这个过程是挂载前的动作。 创造出的dom还没有被使用,仅仅在内存中,需要“挂载”,然后你最外层一个叫app的id的dom,挂载就是document.querySelector(‘app’).appendChild(dom),就完成挂载啦。

在这里插入图片描述

注意点

(1)这里对 mounted 钩子函数执行有一个判断逻辑,vm.$vnode 如果为 null,则表明这不是一次组件的初始化过程,也就是根组件的渲染通过外部 new Vue 初始化过程。那么对于组件(非根组件)的 mounted 时机在哪里?

 if (vm.$vnode == null) {vm._isMounted = truecallHook(vm, 'mounted')}

组件(非根组件)的渲染节点

(1)invokeInsertHook函数

组件的 VNode patch 到 DOM 后,会执行 invokeInsertHook 函数,把 insertedVnodeQueue 里保存的钩子函数依次执行一遍,它的定义在 src/core/vdom/patch.js 中:
在这里插入图片描述

(2)insert方法

在这里插入图片描述

(3)insert方法说明

我们可以看到,insert方法中每个子组件都是在这个钩子函数中执行 mounted 钩子函数,并且我们之前分析过,insertedVnodeQueue 的添加顺序是先子后父,所以对于同步渲染的子组件而言,mounted 钩子函数的执行顺序也是先子后父。

3.beforeUpdate & updated

beforeUpdate & updated 更新前后,顾名思义,就是在数据变化前后执行的钩子函数

(1)beforeUpdate 的执行时机是在渲染 Watcher 的 before 函数中

路径:src\core\instance\lifecycle.ts
在这里插入图片描述

(2)update 的执行时机在flushSchedulerQueue 函数调用

路径: src\core\observer\scheduler.ts
在这里插入图片描述

(3)问题:为什么在 callUpdatedHooks 函数中,只有 vm._watcher 的回调执行完毕后,才会执行 updated 钩子函数

在组件 mount 的过程中,会实例化一个渲染的 Watcher 去监听 vm 上的数据变化重新渲染,这段逻辑发生在 mountComponent 函数执行的时候:
路径:src\core\instance\lifecycle.ts
在这里插入图片描述
在实例化 Watcher 的过程中,它的构造函数里会判断 isRenderWatcher,接着把当前 watcher 的实例赋值给 vm._watcher
路径: src\core\observer\watcher.ts
在这里插入图片描述
把当前 wathcer 实例 push 到 vm._watchers 中,vm._watcher 是专门用来监听 vm 上数据变化然后重新渲染的,所以它是一个渲染相关的 watcher,因此在 callUpdatedHooks 函数中,只有 vm._watcher 的回调执行完毕后,才会执行 updated 钩子函数。

4.beforeDestroy & destroyed

beforeDestroy & destroyed销毁 前后,就是$destroy方法中

路径:src\core\instance\lifecycle.ts
在这里插入图片描述

beforeDestroy 钩子函数的执行时机是在 $destroy 函数执行最开始的地方,接着执行了一系列的销毁动作,包括从 parent 的 $children 中删掉自身,删除 watcher,当前渲染的 VNode 执行销毁钩子函数等,执行完毕后再调用 destroy 钩子函数。

注意点:在 $destroy 的执行过程中,它又会递归调用 vm.patch(vm._vnode, null) 触发它子组件的销毁钩子函数,所以 destroy 钩子函数执行顺序是先子后父,和 mounted 过程一样。


总结

遇到过的面试题

问:create和mounted的区别?
答:create是初始化后执行的函数,mounted是挂载后执行的函数。
问:那我如何在create执行dom操作呢?
答:在create中使用setTimeout或nextTick即可

问:父子组件中的钩子函数如何执行
答:

加载渲染过程: 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted

子组件更新过程
父beforeUpdate->子beforeUpdate->子updated->父updated

父组件更新过程
父beforeUpdate->父updated

销毁过程
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

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

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

相关文章

docker离线安装及部署各类中间件(x86系统架构)

前言:此文主要针对需要在x86内网服务器搭建系统的情况 一、docker离线安装 1、下载docker镜像 https://download.docker.com/linux/static/stable/x86_64/ 版本:docker-23.0.6.tgz 2、将docker-23.0.6.tgz 文件上传到服务器上面,这里放在…

【WIN11新机/重装系统 把尿级系统设置优化】

目录 一、更改鼠标样式二、更改显示器刷新率三、常规文件存储路径0.存储感知1.保存新内容的地方2.快捷访问的文件路径3.Edge浏览器下载路径 四、通知关闭五、开机自启动关闭六、隐私关闭七、性能优化1.开机优化2.用户账控制关闭 八、关闭Windows自动更新九、任务栏设置十、必装…

7.若依参数设置、通知公告、日志管理

参数设置 对系统中的参数进行动态维护。 关闭验证码校验功能 打开页面注册功能 需要修改前端页面代码 通知公告 促进组织内部信息传递 若依只提供了一个半成品,只实现了管理员可以添加通知公告。 日志管理 追踪用户行为和系统运行状况。 登录日志 和操作日志…

修改网络ip地址方法有哪些?常用的有这四种

在数字时代,IP地址作为网络设备的唯一标识,对于网络连接和通信至关重要。然而,有时候我们可能需要修改设备的IP地址,以满足特定的网络需求或解决网络问题。本文将为您详细介绍几种修改网络IP地址的常用方法,无论是对于…

【Java项目】基于SpringBoot的【外卖点餐系统】

【Java项目】基于SpringBoot的【外卖点餐系统】 技术简介:本系统使用JSP技术,采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介:管理员;首页、个人中心、用户管理、商家管理、菜品分类管理、骑手管理、系统管理…

Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化

如何使用 Maven 将 Spring Boot 应用程序 Docker 化? Docker是一个开源容器化工具,用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中,为了将Spring B…

计算机网络|数据流向剖析与分层模型详解

文章目录 一、网络中的数据流向二、计算机网络通信模型1.OSI 模型2.TCP/IP 模型3.TCP/IP五层模型3.1 分层架构描述3.2各层地址结构3.3UDP数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中,数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…

uniapp——微信小程序,从客户端会话选择文件

微信小程序选择文件 文章目录 微信小程序选择文件效果图选择文件返回数据格式 API文档: chooseMessageFile 微信小程序读取文件,请查看 效果图 选择文件 /*** description 从客户端会话选择文件* returns {String} 文件路径*/ const chooseFile () &g…

vue3+vite+nginx打包

在开发环境下,已经可以正常地运行一个有增删改查功能的页面了,但如何把它发布到运行服务器呢?仍有许多的问题需要探索。 网上很多文章给了很大的帮助,但总是没有说明原理,对于像我这样的初学者来说,不知其…

CAN201 Introduction to Networking(计算机网络)Pt.2 传输层

文章目录 3. Transport Layer(传输层)3.1 Multiplexing and demultiplexing(多路复用和多路分解)3.2 Connectionless transport:UDP3.3 Principles of reliable data transfer3.4 Pipelined communication3.5 TCP: con…

JVM 详解

一. JVM 内存区域的划分 1. 程序计数器 程序计数器是JVM中一块比较小的空间, 它保存下一条要执行的指令的地址. [注]: 与CPU的程序计数器不同, 这里的下一条指令不是二进制的机器语言, 而是Java字节码. 2. 栈 保存方法中的局部变量, 方法的形参, 方法之间的调用关系. 栈又…

Docker--Docker Network(网络)

Docker为什么需要网络管理 容器的网络默认与宿主机及其他容器之间是隔离的,但有时也需要与宿主机和容器进行通信。 容器间及容器与外部通信的需求 容器间通信:在Docker环境中,容器默认与宿主机及其他容器是相互隔离的。然而,在实际应用中&…

深入浅出 MyBatis | CRUD 操作、配置解析

3、CRUD 3.1 namespace namespace 中的包名要和 Dao/Mapper 接口的包名一致! 比如将 UserDao 改名为 UserMapper 运行发现抱错,这是因为 UserMapper.xml 中没有同步更改 namespace 成功运行 给出 UserMapper 中的所有接口,接下来一一对…

UE5材质节点Panner

Panner节点可以让贴图动起来,快捷键是P,Speed的数值大小就是贴图移动的快慢,x和y是方向 这个节点可以用来做,传送带,护盾,河流,岩浆,瀑布等 制作岩浆流动效果 创建材质,…

Kimi进行学术方向选择精讲!

目录 1.文献搜索 2.辅助选题 3.选题判断 在我们之前的文章中,小编都强调了选题在文章价值中的核心作用。一篇优秀的文章背后,肯定有一个精心挑选的选题。选题的好坏直接影响着文章能够发表的期刊等级。许多宝子们却采取了相反的做法,将大量…

Google Veo AI 视频生成工具评测:AI视频生成的未来已来

近年来,AI技术的迅猛发展使得我们对虚拟现实的认知不断发生改变,尤其是在视频生成领域。Google 最新推出的 Veo AI 视频生成工具,无疑为这一领域带来了前所未有的突破。通过与其他知名工具如 OpenAI 的 Sora 进行对比,Veo 显示出令…

idea 8年使用整理

文章目录 前言idea 8年使用整理1. 覆盖application配置2. 启动的时候设置编辑空间大小,并忽略最大空间3. 查询类的关系4. 查看这个方法的引用关系5. 查看方法的调用关系5.1. 查看被调用关系5.2. 查看调用关系 6. 方法分隔线7. 选择快捷键类型8. 代码预览插件9. JReb…

3.微服务灰度发布落地实践(组件灰度增强)

文章目录 前言调用链示图dubbo服务之间的的调链cloud 服务之间的调用链 网关servlet容器: 标签续传1.定义插件2.实现灰度增强拦截 线程池: 标签续传1.拦截Runnable或Callable,接口增强实现标签续传;Callable 插件定义Runnable 插件定义拦载Callabl或Runnable构造(可共用)拦载ru…

java基础知识22 java的反射机制

一 java反射机制 1.1 概述 Java反射,程序在运行时,动态获取类信息(类元数据),获取字段属性,动态创建对象和调用方法。Spring框架正是基于反射机制,通过我们的配置文件,在项目运行时…

[羊城杯 2024]Check in

下载附件,解压的时候发现注释:5unVpeVXGvjFah 解压得到的flag.txt文件内容如下: 注释5unVpeVXGvjFah放到随波逐流中一键解码发现base58解码得出一个正常点的字符串:Welcome2GZ,应该是某个key? 去hex解码&am…