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

什么是React.FC| 组件接受属性props有什么用 | ant design 封装独立弹框组件之-修改密码弹框组件 React提供了一个组件类型React.FunctionComponent,可简写React.FC。 阅读详情

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 就是上面的 unresolvedProps
  const 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 很可能处理 child
  return workInProgress.child;
}
  • 关于 workInProgress.effectTag |= PerformedWork; 这种操作
    • 在 ReactEffectTags.js 文件中, 有所有可能产生effect的值
    • 这里都是二进制的,每个值的1所在位置都是不一样的
    • 通过逻辑操作,&, | 的联合判断是否有某个特性
    • 上面 PerformedWork 本质是没有什么意义的
    • 是给 DevTools 说明这个组件在渲染中有更新
  • 关于 reconcileChildren 是通用的调节子节点的核心流程,这块先跳过
React Context API 原理深度解析:不是状态管理,而是渲染引擎级通信机制 Context API 是 React 16.3 引入的跨层级数据传递基础设施,其本质并非状态管理工具,而是基于 Fiber 架构构建的上下文绑定机制。它通过特殊的 fiber tag(ContextProvider)、依赖链表(contextDependencies)和位掩码(changedBits)实现细粒度更新调度,使 context 消费具备 O(1) 读取性能与可中断渲染能力。相比 Redux 等应用层状态库,Context 的技术价值在于零开销的环境配置分发(如 theme、locale、aut 阅读详情

相关推荐

【Python】SimpleITK使用笔记

1. 概念 1.1 nii格式 1.2 SimpleITK 1.3 SimpleITK 图像 2. 基本操作 2.1 常见属性 2.1 读取和保存图像 2.2 SimpleITK图像数据和Numpy矩阵数据之间的转换

See_Star的博客 7900

React学习笔记2-Function Component

Function Component 学无止境。——荀子 接着学习一下React的function component。 之前React主要通过class的方式来构建UI组件,但是可能在很多项目中存在一些弊端。Facebook设计了React Hook的方式,可以不通过class的方式来完成同样的功能。也就是只需要通过function component即可,这样带来的好处是代码更简单,bug...

Unplugged 3320

Shell数学计算(算术运算,加减乘除运算)

声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用,在该博客的基础上做了一定程序的简略和修改。 参考博客 : 原文链接:http://c.biancheng.net/shell/ Shell数学计算Shell数学计算数学计算命令对整数进行数学运算: (()) / let / $[] /exprShell (())Shell let命令bc命令:一款数学计算器在 Shell 中使用 bc 计算器 Shell数学计算 默认情况下,Shell 不会直接进行算术运算,而是把+两边的数据(数

AKUANer的博客 2万+

React-component-function-函数组件(特点/组合/抽离)

组件&Props - React:https://zh-hans.reactjs.org/docs/components-and-props.html 1.特点

m0_65912225的博客 1685

一文搞定学术英语写作 (斯坦福SCI论文写作课程笔记)

0.前言: 本文基于斯坦福Kristin Sainani 教授的学术论文写作公开课——SCI论文写作(Writing in the Sciences)。在此基础上进行章节顺序的重排及部分内容的删减,以方便第一次进行英语学术论文写作的同学快速上手。 时间充足和想要系统学习英文学术写作的同学,十分建议观看完整课程视频,一定会受益匪浅!课程地址如下: 课程B站地址:https://www.bilibili.com/video/BV1zv41177JQ 1.论...

Ogmx的博客 3万+

面试中常考的数学题——截木棍、圆上取点、赛马、红蓝墨水,测试毒药、坐到正确座位问题

文章目录1.将一根木棒截成三段,问能够组成三角形的概率;2.在圆上任取三点,问能够组成锐角、直角、钝角三角形的概率;3.共有25匹马,找出最快的3匹,只有5个赛道,每次比赛只能得到5匹马的速度排序,最少需要多少次比赛;4 有两瓶红蓝墨水,体积一样,现在从红墨水中舀一勺加入蓝墨水中,搅拌均匀后,在从蓝墨水中舀一勺加到红墨水中,试问这两瓶墨水哪瓶纯度更高。 1.将一根木棒截成三段,问能够组成三角形的概率; 来源:https://blog.csdn.net/weixin_41245919/article/deta

weixin_41558411的博客 4907

React 组件性能优化——function component

1. 前言函数式组件是一种非常简洁的数据驱动 UI 的实现方式。如果将 React 组件拆分成三个部分 —— 数据、计算和渲染,我们可以看到性能优化的几个方向。数据:利用缓存,减少rer...

奇舞周刊 1676

R语言广义加型模型(GAM)的运用例子及实现教程

一旦拟合了广义加型模型,我们可以查看模型摘要和诊断,以评估模型的质量和拟合情况。# 查看模型摘要响应变量:mpg(汽车的燃油效率)拟合函数:mpg ~ s(hp) + s(wt)

Mrrunsen的博客 3447

实现function component

实现function component 处理function component的props传参 重构function component 将处理function component和处理正常dom节点的分开封装起来。代码更加的简洁。

m0_48505165的博客 625

深度学习部署工程师--8(docker+TensorRT部署到推理+yolo人体检测)下

本文介绍了YOLOv5模型通过TensorRT加速部署的流程。首先需要检查磁盘空间,确保有30GB可用。文章对比了不同推理方式的性能:int8量化+TensorRT可达200FPS,纯TensorRT为166FPS,CUDA为147FPS,CPU为93FPS。重点讲解了将YOLOv5模型导出为ONNX格式的详细步骤,包括修改Detect类的forward方法以移除decode运算,使用git patch批量修改代码,安装必要的依赖库,以及通过onnx-graphsurgeon工具修改ONNX图结构。最终目标

FJN110的博客 496

基于RK3568的YOLOv11模型端侧推理优化与部署实战指南

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

m0_64661770的博客 115

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

我们通过React.memo这个方法创建的组件,它的所有props是直接作用于传入的 function component的。,它会把props作为我自己当前这个组件。为什么在这里它不使用。

Wang的专栏 1012

vue:npm安装pnpm报错,npm ERR! code ENOTFOUND,npm ERR! syscall getaddrinfo,npm ERR! errno ENOTFOUND详细排查解决!

vue2 vue3,npm install -g pnpm 安装出现错误,安装pnpm及解决安装失败问题,解决 npm无法安装pnpm问题,npm 安装 pnpm 时 报错 npm ERR! code ENOTFOUND,pnpm无法安装报错,vue npm install -g pnpm安装报错,request to http://registry.cnpmjs.org/pnpm failed, reason: getaddrinfo ENOTFOUND registry.cnpmjs.org,安装pnp

✅ 精选推荐文章 3609

React16源码: memo, Fragment, StrictMode, cloneElement, createFactory源码实现

关于 memo, Fragment, StrictMode, cloneElement, createFactory 的源码实现

Wang的专栏 921

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

这是一个比较特殊的component的类型, 就是还没有被指定类型的component, 在一个fibrer被创建的时候,它的tag可能会是 `IndeterminateComponent`

Wang的专栏 1298

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

React16源码: Hooks源码实现

就跟我们在class component里面看到的,它的 setState 调用的是 this.updateSetState。在这里的 dispatch 也是从不同平台上面,它传入进来的一个东西,不是我们在react中定义的。一个是 current , 就是这个current就对应正在目前正在渲染的哪一个节点的一个实例。同理,useEffect和其他内容也基本是类似的,只不过它最终调用的方法会不一样。所以在react中我们可以看到的源码就非常的简单,就是这么一些相关的东西。定位到 useState。

Wang的专栏 1385

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

React16源码: createRef与forwardRef源码实现

拿一个场景举例开始比如,在react当中写一个组件,类型是 class Component在 render function 里面渲染一系列的子组件或者 dom节点会有这样的需求,就是获取某个dom节点或某个子组件的实例来做一些手动的操作不局限于 props 更新这种方式来更新这个节点,获取节点后,可以绑定某些事件做一些操作如果没有其他好方法,可能要自己去写之类的选择器来获取这个 dom 节点在 react 当中就为我们提供了这种方式。

Wang的专栏 1443

React16源码: React中commitAllHostEffects内部的commitWork的源码实现

以上就是整个 commitWork 里面做的事情, 具体的细节写在代码注释里。对于 HostText 它也要进行一个更新,它调用了一个。对于 HostComponent 来说。

Wang的专栏 1380

React 深度学习:ReactWorkTags

packages/shared/ReactWorkTags.js 源码 export type WorkTag = | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18; export const Fu...

weixin_30339969的博客 364

React 源码讲解第 4 节- Fiber 对象

本小节介绍 Fiber 对象的含义、类型以及具体包含哪些属性。

杏子 821

从看ahooks源码说起:源码准备阶段

pnpm是 Node.js 的替代包管理器。它是 npm 的直接替代品,但速度更快、效率更高。为什么效率更高?当您安装软件包时,我们会将其保存在您机器上的全局存储中,然后我们会从中创建一个硬链接,而不是进行复制。对于模块的每个版本,磁盘上只保留一个副本。例如,当使用 npm 或 yarn 时,如果您有 100 个使用 lodash 的包,则磁盘上将有 100 个 lodash 副本。pnpm 可让您节省数 GB 的磁盘空间!...

weixin_43867717的博客 457

React源码解析:简述React 16 版本中 commit 阶段的三个子阶段分别做了那些事?

(1)before mutation阶段(执行DOM操作前):处理类组件的getSnapShotBeforeUpdate 生命周期函数 处理DOM节点渲染/删除后的 autoFocus、blur逻辑; 调用getSnapshotBeforeUpdate生命周期钩子; 调度useEffect。 (2)mutation阶段(执行DOM操作):将 workInProgress Fiber 树变成 current Fiber 树 如果该fiber类型是ClassComponent的话,执行getSnapsho

Baron的技术blog 544

源码解析 React Hook 构建过程

2018 年的 React Conf 上 Dan Abramov 正式对外介绍了React Hook,这是一种让函数组件支持状态和其他 React 特性的全新方式,并被官方解读为这是下一个 5 年 React 与时俱进的开端。从中细品,可以窥见React Hook的重要性。今年 2 月 6 号,React Hook 新特性随 React v16.8.0 版本正式发布,整个上半年 React 社区都...

weixin_30889885的博客 651

ahooks解决React闭包问题方法示例

这篇文章主要为大家介绍了ahooks解决React闭包问题方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪本文是深入浅出 ahooks 源码系列文章的第三篇,这个系列的目标主要有以下几点:注:本系列对 ahooks 的源码解析是基于 。自己 folk 了一份源码,主要是对源码做了一些解读,可见 详情。系列文章:本文来探索一下 ahooks 是怎么解决 React 的闭包问题的?。先来看一个例子:12345678910111213141516 代码示例当我点击按钮的时

包磊磊的博客 1320

使用 MySQL 新建数据库搭建 Prisma Server:Docker 部署、服务发布与 GraphQL API 全流程实战

本教程来自 Prisma 1.x 官方文档体系(`docs/1.10/03-Tutorials2/01-Setup-Prisma/02-Create-New-DB/01-MySQL.md`),完整演示如何在本地通过 Docker 创建一台基于 MySQL 的 Prisma server,并部署第一个 Prisma service,最终通过 GraphQL Playground 对自动生成的 CRU

gitblog_00142的博客 893

react 遍历对象_「译」如何以及为什么React Fiber使用链表遍历组件树

原文地址:The how and why on React’s usage of linked list in Fiber to walk the component’s tree原文作者:Max Koretskyi译文出自:阿里云翻译小组译文链接:https://github.com/dawn-plex/translate/blob/master/articles/the-how-and-why...

weixin_39949386的博客 98
上一篇: React16源码: React中的beginWork的源码实现
下一篇: React16源码: React中的reconcileChildren的源码实现
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值