React16源码: React中的FunctionComponent的源码实现

Function Component

1 )概述

  • FunctionComponent 是引出调和子节点的过程
  • 调和子节点是一个统一的过程,和各类组件不同类型没有太大关系
    • 在 ReactDOM.render 第一次时,只有一个Fiber对象
    • 这个Fiber对象它会保存它的props, 里面有很多的children
    • 里面的 props.children 是 App 对应的 ReactElement
    • 这个 ReactElement 不是 Fiber 对象,肯定要去创建它的Fiber对象
    • 在 ReactDom.render 的过程中, 是一步一步的往下执行
    • 对于children,肯定要判断 ReactElement 的类型
    • 基于不同类型做对应的处理方式,这个过程肯定是非常重要的

2 )源码

定位到 packages/react-reconciler/src/ReactFiberBeginWork.js
的 beginWork 函数,在 beginWork 下面的 执行 switch case 中

// beginWork 函数中的截取部分
case FunctionComponent: {// 这里的 type 就是 ReactElement 里面存储的 type 属性// 这个 type 属性里面存储的就是 组件,如果是dom原生组件就是字符串// 如果组件是 function component 就是一个方法,如果是 class component 它就是类const Component = workInProgress.type;// pendingProps 是新渲染的时候产生的 props,这个和调和子节点有关系const unresolvedProps = workInProgress.pendingProps;// 这个 resolvedProps 是和 Suspense 组件有关的,throw 的是一个 Promise 可能会resolve出一些东西// 可以先默认 resolvedProps 就是上面的 unresolvedPropsconst resolvedProps =workInProgress.elementType === Component? unresolvedProps: resolveDefaultProps(Component, unresolvedProps);return updateFunctionComponent(current,workInProgress,Component,resolvedProps,renderExpirationTime,);
}

进入到 updateFunctionComponent 方法

function updateFunctionComponent(current,workInProgress,Component,nextProps: any,renderExpirationTime,
) {// 获取两个 context 先跳过const unmaskedContext = getUnmaskedContext(workInProgress, Component, true);const context = getMaskedContext(workInProgress, unmaskedContext);let nextChildren;prepareToReadContext(workInProgress, renderExpirationTime);// 跳过 DEV 相关if (__DEV__) {ReactCurrentOwner.current = workInProgress;ReactCurrentFiber.setCurrentPhase('render');nextChildren = Component(nextProps, context);ReactCurrentFiber.setCurrentPhase(null);} else {// 这里的 Component 就是组件的方法// 调用 Component 方法的时候传入 nextProps, context 两个参数// context 这个在 官网API文档中没有提及// 可以在 function component 中获取到 child组件的 contextTypes 属性,也就是组件加上这个属性并配置props// 组件内就可以获取上层传递过来的 context nextChildren = Component(nextProps, context);}// React DevTools reads this flag.// workInProgress.effectTag |= PerformedWork;reconcileChildren(current,workInProgress,nextChildren,renderExpirationTime,);// 这里 return 的是 child, 说明 在 reconcileChildren 很可能处理 childreturn workInProgress.child;
}
  • 关于 workInProgress.effectTag |= PerformedWork; 这种操作
    • 在 ReactEffectTags.js 文件中, 有所有可能产生effect的值
    • 这里都是二进制的,每个值的1所在位置都是不一样的
    • 通过逻辑操作,&, | 的联合判断是否有某个特性
    • 上面 PerformedWork 本质是没有什么意义的
    • 是给 DevTools 说明这个组件在渲染中有更新
  • 关于 reconcileChildren 是通用的调节子节点的核心流程,这块先跳过

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

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

相关文章

【网络安全知识】5种较流行的网络安全框架及特点分析

网络安全框架主要包括安全控制框架(SCF)、安全管理框架(SMP)和安全治理框架(SGF)等类型。 对于那些希望按照行业最佳实践来开展网络安全能力建设的企业来说,理解并实施强大的网络安全框架至关重…

雍禾植发为地球种下发际线,雍禾医疗以公益名义为消费者种下希望

“绿水青山才是金山银山”,绿色现已成为新时代中国的鲜明底色。天更蓝,水更清,人与环境和谐发展已深入人心。位于内蒙古自治区阿拉善盟西部的额济纳旗常年干旱少雨,风沙肆虐,这里亟需被植上一片森林,为地球…

使用Spring管理Caffeine缓存(CacheManager+Caffeine)

1 依赖 使用Spring管理Caffeine缓存的主要pom依赖如下所示。 <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version> </dependency><dependency…

介绍 sCrypt:BTC 的 Layer-1 智能合约框架

在 TypeScript 中开发 BTC 智能合约 我们非常高兴地推出 sCrypt&#xff1a;一种现代 Typescript 框架&#xff0c;用于在 BTC 上开发第一层智能合约&#xff0c;无需分叉。 现在&#xff0c;人们可以使用现代开发工具在易于使用的统一框架中编写、测试、调试、部署和调用智能合…

Microsoft Word 删除空行

Microsoft Word 删除空行 1. 删除空行1.1. 替换1.2. 段落标记 References 1. 删除空行 1.1. 替换 1.2. 段落标记 特殊格式 -> 段落标记 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

DQN、Double DQN、Dueling DQN、Per DQN、NoisyDQN 学习笔记

文章目录 DQN (Deep Q-Network)说明伪代码应用范围 Double DQN说明伪代码应用范围 Dueling DQN实现原理应用范围伪代码 Per DQN (Prioritized Experience Replay DQN)应用范围伪代码 NoisyDQN伪代码应用范围 部分内容与图片摘自&#xff1a;JoyRL 、 EasyRL DQN (Deep Q-Networ…

RAM读写测试

真双口RAM读写测试 IP核设置如下 注意点是&#xff1a; 1、wea信号位宽由于选择了32bit地址&#xff0c;导致使能了按字节写入&#xff0c;因此wea每一位对应一个8bit的din&#xff0c;高有效&#xff1b; 2、rsta 信号指RAM复位置位信号&#xff0c;高有效&#xff0c;但是…

Altium Designer简介以及下载安装

阅读引言&#xff1a; Altium Designer的离线安装包在文章最后&#xff0c; 注意该软件只能用于个人的学习使用&#xff0c; 不能用于商业用途&#xff0c; 文章主题图片来自网络。 一、Altium Designer简介 Altium Designer是一款功能强大的电子设计自动化&#xff08;EDA&…

【GAMES101】Lecture 07 着色(shading)

目录 着色 Blinn-Phong反射模型 漫反射 光衰减 着色 这个着色&#xff08;shading&#xff09;就是将不同的材质应用到不同的物体上&#xff0c;像一个物体&#xff0c;它可以是木头的、金属的、塑料的…… Blinn-Phong反射模型 我们来看一个简单的着色模型&#xff0c;…

导航相关知识3

接下来看下引导模块 从三个方面来写吧&#xff0c;绘制&#xff0c;回调&#xff0c;用户操作 绘制&#xff1a; 自定义绘制 各种图标&#xff0c;参考点的调整&#xff0c;主要注意点是防止未释放导致的泄露 PrepareLayerStyleInner这个类里包含了app和sdk交互的绘制接口&…

冻结Prompt微调LM: PET(b) LM-BFF

PET-TC(B) paper b: 2020.9 It’s not just size that matters: Small language models are also few-shot learners. Prompt&#xff1a; 多字完形填空式人工Prompt Task&#xff1a;Text Classification Model: Albert-xxlarge-v2 Take Away: 支持多字的完形填空Prompt&a…

基于DQN和TensorFlow的LunarLander实现(全代码)

使用深度Q网络&#xff08;Deep Q-Network, DQN&#xff09;来训练一个在openai-gym的LunarLander-v2环境中的强化学习agent&#xff0c;让小火箭成功着陆。 下面代码直接扔到jupyter notebook或CoLab上就能跑起来。 目录 安装和导入所需的库和环境Q网络搭建经验回放实现DQNAge…

【算法Hot100系列】字母异位词分组

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

环境变量配置文件

1.配置文件简介 source命令 source命令通常用于保留、更改当前shell中的环境变量。 格式&#xff1a; source 配置文件 . 配置文件 环境变量配置文件简介 环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量&#xff0c;比如PATH、HISTSI…

(二十)Flask之上下文管理第一篇(粗糙缕一遍源码)

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

cmake 自定义宏

cmake 自定义宏 宏定义 add_definitions(-D宏名称 -D宏名称 ...)通过宏定义的方式&#xff0c;对程序中的代码进行控制

Linux 常用命令分享与示例

Linux 是一种强大的操作系统&#xff0c;广泛用于服务器、桌面和移动设备。它的命令行界面&#xff08;CLI&#xff09;提供了许多有用的命令&#xff0c;可以方便地进行系统管理和文件操作。 一、文件操作命令 1、 ls&#xff1a;列出目录中的文件和子目录 ls -l /home这将显…

Vue在组件上使用ref代码及总结

//可以通过 this.$refs将数据用子组件函数传递&#xff0c;在子组件函数接收数据&#xff0c;达到修改数据的目的 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" conten…

Ikuai中如何添加/更换虚拟机(图文)

Ikuai配置 分区/格式化硬盘(如果已经格式化&#xff0c;无需再次格式化&#xff0c;直接传送到上传镜像) 上传镜像 ⚠️&#xff1a;如果是压缩格式&#xff0c;需要解压缩后上传&#xff0c;如这里的IMG格式。 创建虚拟机 配置虚拟机&#xff08;等待虚拟机起来后执行&#…

Vulnhub-w1r3s-editable

一、信息收集 端口扫描&#xff0c;ftp允许匿名登录&#xff0c;但是没有得到什么有用的线索 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later | ftp-syst: | STAT: | FTP server status: | Connected to ::ffff:192.168.1.6 | …