React hooks源码阅读

news2024/11/18 3:41:42

一、版本

  • react:17.0.2
  • react-dom: 17.0.2

二、代码仓库

react源码的管理方式是monorepo模式,它把react中相对独立的模块分割出来作为一个软件包(例如:react包、react-dom包、react-server包等等),将所有软件包统一放置在/packages中,这样一个react代码仓库就包含了所有的react模块。源码地址

三、前置

本次hooks源码阅读,以useState为切入点进行分析。在分析前需要了解一些前置知识点:

(一)ReactElement与fiber

入口函数ReactDom.render,function组件的return、class组件的render,所有采用jsx语法书写的节点,都会被编译器转换,最终以React.createElement()的方式创建出一个对应的ReactElement对象。ReactElement不是一个严格的树,也不是一个严格的链表,在生成过程中是从入口函数ReactDOM.render开始,至顶向下生成的,是所有组件节点的总和

在ReactElement树(暂且用树表述)和fiber树是以props.children为单位先后交替生成的,ReactElement树构造完毕,fiber树也随后构造完毕。在reconciler阶段会根据ReactElement类型生成对应的fiber节点,但ReactElement与fiber节点并非一一对应,例如Fragement类型的组件在生成fiber节点的时候会被忽略。

import ReactDOM from 'react-dom';
//入口函数
ReactDOM.render(
  <App />,
  document.getElementById('root')
);

fiber的更新列表中每一个节点中有一个shared属性,该属性指向一个共享更新队列。在class组件中调用setState()时,将会创建新的update对象,并将该update对象添加至当前组件对应fiber节点的shared属性所指向的共享队列中。而对于function组件,为了能够保持function组件的状态,引入了Hook。

(二)fiber与hook

在fiber对象中有一个属性fiber.memoizedState指向fiber节点的内存状态,在function类型组件中,fiber.memoizedState就指向了该function组件的Hook队列。该Hook队列保存了function类型的组件状态。function组件中hook与fiber的关系以及class组件fiber更新队列如下图所示。
fiber+hook

四、分析useState

(一)分析fiber与hook如何关联上

useState,useReducer可以在function组件添加内部的state,且useState实际上是useReducer的简易封装,是一个最特殊的useReducer。因此useState,useReducer也称为状态Hook。故此次以useState为分析点进行分析。

对于fiber,class组件、function组件都实现了状态持久化,不同的是class组件是维护fiber.memoizedState;function组件是维护Hook来实现状态持久化。在fiber树构造过程中,不同的fiber类型,只需要调用不同的处理函数来获取fiber子节点。从调用方来讲,只需要调用beginWork(),具体根据不同类型应该调用哪种处理函数则被封装在beginWork函数中,无需关心内部实现。从beginWork函数中我们可以知道function类型调用的是updateFunctionComponent函数,updateFunctionComponent函数内容使用了Hook对象。

在updateFunctionComponent函数中调用了renderWithHooks,至此Fiber与Hook产生了关联。

本次分析源码主要根据第五点的react源码解读系列文章进行学习,从基本概念、运作核心、数据管理等方面依次学习,由于本次项目影响,本次学习计划对hook源码的分析至此,后续将依据此系列文章继续react源码学习。

五、资料分享

在网站查找react-hooks源码解读资料时,发现一个对react源码解读的系列文章,写得很不错,该系列中也有专门针对react-hooks详解。

  • [图解React源码系列] https://github.com/7kms/react-illustration-series/tree/v17.0.2
  • [hook原理] https://github.com/7kms/react-illustration-series/blob/v17.0.2/docs/main/hook-summary.md

源码解读系列

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

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

相关文章

SpringBoot整合logback日志

一、概述 与log4j相比&#xff1a; 实际上&#xff0c;这两个日志框架都出自同一个开发者之手&#xff0c;Logback 相对于 Log4J 有更多的优点 (1)logback不仅性能提升了&#xff0c;初始化内存加载也更小了。 (2)内容更丰富的文档 (3&#xff09;更强大的过滤器 二、步骤…

公网远程ERP - 在外远程登录公司局域网金蝶云ERP管理系统

文章目录 前言1.金蝶安装简介2. 安装cpolar内网穿透3. 创建安全隧道映射4. 在外远程访问金蝶云星空管理中心5. 固定访问地址6. 配置固定公网访问地址7.创建数据中心简介8.远程访问数据中心9. 固定远程访问数据中心地址10. 配置固定公网访问地址 前言 金蝶云星空聚焦多组织&…

Wav2lip-GAN 环境配置

首先使用 conda 创建新的虚拟环境&#xff0c;然后激活这个环境 conda create -n myenv python3.8 activate myenv使用 git 克隆代码&#xff0c;或者直接下载源码压缩包解压&#xff0c;安装依赖&#xff08;我使用的豆瓣源&#xff09; git clone https://github.com/Rudra…

2022年美国大学生数学建模竞赛A题自行车运动员的能量特征解题全过程文档及程序

2022年美国大学生数学建模竞赛 A题 自行车运动员的能量特征 原题再现&#xff1a; 背景   自行车公路赛有多种类型&#xff0c;包括标准赛、团体计时赛和个人计时赛。这些比赛的自行车运动员获胜的机会可能会有所不同&#xff0c;具体取决于赛事的类型、路线和自行车运动员…

js代码执行过程、调用栈、执行上下文

参考资料 极客时间课程《浏览器工作原理与实践》 – 李兵 一、js代码执行过程 &#xff08;一&#xff09;javascript代码的执行流程 浏览器执行javascript代码的流程如下图所示&#xff1a; javascript的执行机制是&#xff1a;先编译&#xff0c;再执行。在编译阶段生成了…

01.LLaMA

文章目录 前言导读摘要 预备知识语言模型ChatGPT性能暴涨的原因&#xff08;涌现&#xff09;GPT-1Transformer 背景介绍模型精讲数据集及处理Common CrawlC4GithubWikipediaGutenberg and Books3ArXivStack Exchange小结 关键TrickPre-normalizationSwiGLURotary Embeddings 实…

判断浏览器是否支持webp图片

.WebP是谷歌主导的开放免费的网络图像格式&#xff0c;其核心编码来自VP8也就是同时支持WebP图片和WebM视频等。 这种图像格式追求的并不是无损画质&#xff0c;而是在有损画质的情况下尽可能的压缩图像体积但也尽量降低清晰度下降。 谷歌资助和发展该图像格式最主要的目的就是…

windows下升级nodejs

重新安装新版nodejs 重新安装nodejs然后设置环境变量 安装yarn npm install -g yarn --registryhttps://registry.npm.taobao.org yarn config set registry https://registry.npm.taobao.org -g yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sa…

IoT -- 解读物联网四层架构

本文以物联网四层架构为基础&#xff0c;从物联网产品设计的角度来解读每层架构的功能以及主要内容&#xff0c;旨在为物联网产品设计以及实现思路感兴趣的物联网产品或研发人员有些帮助。 通过互联网&#xff0c;人和人之间可以传递和交流信息。物联网&#xff0c;IoT&#x…

VMware Aria Automation 8.12 - 现代基础架构自动化平台

VMware Aria Automation 8.12 - 现代基础架构自动化平台 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-aria-automation/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 现代基础架构自动化平台 VMware Aria Au…

python 调用c语言方法详解

Python是一种强大的编程语言&#xff0c; Python在代码的编写中可以使用任何一种编程语言&#xff0c;可以利用其内置函数或模块来完成自己的任务。但是在 Python中调用其他语言的程序时&#xff0c;需要有特定的环境&#xff0c;例如&#xff1a;C、C等。 在 python中调用其他…

(转)雪花算法(SnowFlake)

简介 现在的服务基本是分布式、微服务形式的&#xff0c;而且大数据量也导致分库分表的产生&#xff0c;对于水平分表就需要保证表中 id 的全局唯一性。 对于 MySQL 而言&#xff0c;一个表中的主键 id 一般使用自增的方式&#xff0c;但是如果进行水平分表之后&#xff0c;多…

优化if-else代码的八种方案!

前言 代码中如果if-else比较多&#xff0c;阅读起来比较困难&#xff0c;维护起来也比较困难&#xff0c;很容易出bug&#xff0c;接下来&#xff0c;本文将介绍优化if-else代码的八种方案。 优化方案一&#xff1a;提前return&#xff0c;去除不必要的else 如果if-else代码块…

【花雕学AI】多方评测:有没有ChatGPT开发者模式?ChatGPT有可能被“越狱”吗?

学习ChatGPT过程中&#xff0c;出于好奇心&#xff0c;昨天晚上&#xff0c;第一次尝试使用那个据说能进入开发者模式的英文提示词&#xff0c;这应该是所见过最长的提示词了。经过不同平台的多次测试&#xff0c;总体感觉这是个比较细致的角色扮演&#xff08;扮演开发者模式&…

HTTPS传输过程中做了哪些事?

HTTPS介绍 https是是一种应用层协议&#xff0c;本质上来说是HTTP协议的一个升级版。HTTPS比HTTP更安全&#xff0c;HTTP是明文传输。HTTPS是加密传输。加密过程使用了三种加密手段&#xff1a;证书、对称加密、非对称加密。HTTPS相比于HTTP多了一层SSL/TSL&#xff0c;结构如下…

JUC并发编程17 | synchronized锁升级

尚硅谷&#xff08;121-139&#xff09; Synchronized 锁升级 入门简介 一些面试题&#xff1a; 谈谈你对 Synchronized 的理解 synchronized 的锁升级 在阿里的规范里&#xff1a; 高并发时&#xff0c;同步调用应该去考量锁的性能损耗。能用无锁数据结构&#xff0c;就…

【AI大模型】讯飞版大模型来了!首发通用人工智能评测体系,现场发布四大行业应用成果

文章目录 前言SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写亲自体验写在最后前言 5月6日,讯飞星火认知大模型成果发布会在安徽合肥举行。科大讯飞董事长刘庆峰、研究院院长刘聪发布讯飞星火认知大模型,现场实测大模型七大核心能力,并…

SoapUI简易使用

SoapUI简易使用 一、 什么是soapUI二、简单调用接口三、设置断言四、负载测试五、知识点 一、 什么是soapUI 由于 Web 服务是被程序调用的&#xff0c; 一般不会提供界面让最终用户或测试人员直接使用&#xff0c;soapUI是针对这种情况开发的一个工具&#xff0c;用户可以在 s…

python操作list

lst[1,2,3] print(lst) print(lst[0]) print(lst[-1]) print(lst[0:3:2]) # 判断 print(4 in lst) print(4 not in lst) # 遍历 for i in lst:print(i) # 添加 lst.append(测试) print(lst) # 添加一个列表 lst.extend() # 在任意位置添加一个元素 list.insert(2,12)# 删除操作…