React 深度学习:Fiber-ReactFiberLazyComponent

2023-11-08

ReactLazyComponent

包: packages/shared/ReactLazyComponent.js

/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow
 */

export type Thenable<T, R> = {
  then(resolve: (T) => mixed, reject: (mixed) => mixed): R,
};

export type LazyComponent<T> = {
  $$typeof: Symbol | number,
  _ctor: () => Thenable<{default: T}, mixed>,
  _status: 0 | 1 | 2,
  _result: any,
};

type ResolvedLazyComponent<T> = {
  $$typeof: Symbol | number,
  _ctor: () => Thenable<{default: T}, mixed>,
  _status: 1,
  _result: any,
};

export const Pending = 0;
export const Resolved = 1;
export const Rejected = 2;

export function refineResolvedLazyComponent<T>(
  lazyComponent: LazyComponent<T>,
): ResolvedLazyComponent<T> | null {
  return lazyComponent._status === Resolved ? lazyComponent._result : null;
}
复制代码

ReactFiberLazyComponent

包:packages/react-reconciler/src/ReactFiberLazyComponent.js

/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow
 */

import type {LazyComponent, Thenable} from 'shared/ReactLazyComponent';

import {Resolved, Rejected, Pending} from 'shared/ReactLazyComponent';
import warning from 'shared/warning';

export function resolveDefaultProps(Component: any, baseProps: Object): Object {
  if (Component && Component.defaultProps) {
    // Resolve default props. Taken from ReactElement
    const props = Object.assign({}, baseProps);
    const defaultProps = Component.defaultProps;
    for (let propName in defaultProps) {
      if (props[propName] === undefined) {
        props[propName] = defaultProps[propName];
      }
    }
    return props;
  }
  return baseProps;
}

export function readLazyComponentType<T>(lazyComponent: LazyComponent<T>): T {
  const status = lazyComponent._status;
  const result = lazyComponent._result;
  switch (status) {
    case Resolved: {
      const Component: T = result;
      return Component;
    }
    case Rejected: {
      const error: mixed = result;
      throw error;
    }
    case Pending: {
      const thenable: Thenable<T, mixed> = result;
      throw thenable;
    }
    default: {
      lazyComponent._status = Pending;
      const ctor = lazyComponent._ctor;
      const thenable = ctor();
      thenable.then(
        moduleObject => {
          if (lazyComponent._status === Pending) {
            const defaultExport = moduleObject.default;
            if (__DEV__) {
              if (defaultExport === undefined) {
                warning(
                  false,
                  'lazy: Expected the result of a dynamic import() call. ' +
                    'Instead received: %s\n\nYour code should look like: \n  ' +
                    "const MyComponent = lazy(() => import('./MyComponent'))",
                  moduleObject,
                );
              }
            }
            lazyComponent._status = Resolved;
            lazyComponent._result = defaultExport;
          }
        },
        error => {
          if (lazyComponent._status === Pending) {
            lazyComponent._status = Rejected;
            lazyComponent._result = error;
          }
        },
      );
      // Handle synchronous thenables.
      switch (lazyComponent._status) {
        case Resolved:
          return lazyComponent._result;
        case Rejected:
          throw lazyComponent._result;
      }
      lazyComponent._result = thenable;
      throw thenable;
    }
  }
}复制代码

从上面的代码中,可以看到 React 内部解析 Component 组件的默认 props 的方式:

  • 使用 Object.assign 将传入的 props 合并到一个新对象中
  • 遍历 Component.defaultProps 属性,拷贝 props 中不存的属性到新对象中
  • 返回新对象



转载于:https://juejin.im/post/5cf5a9a8518825019319a06a

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 深度学习:Fiber-ReactFiberLazyComponent 的相关文章

  • React-native:将场景绑定到导航栏

    我正在整理这个提问 回答应用程序 并遇到了这个障碍 我想从导航栏触发场景中的功能 与登录应用程序类似 我在导航栏中有一个用于提交答案的按钮 RightButton route navigator index navState if rout
  • 仅当表单已提交时才触发 jQuery 表单验证?

    不引人注目的验证基于这样的想法 don t进行表单验证 直到用户提交表单 一旦发生这种情况 如果表单上的某些内容无效 那么一旦用户更改了每个字段 就会立即验证它 我想做的是 不显眼地 触发表单元素的验证 也就是说 only如果用户已尝试提交
  • Angular 2 链式 Promise 并传递拒绝

    应该是一个简单的问题 但是我找不到有关如何做到这一点的文档 像这样链接一个承诺 Making a promise no problem let promise new Promise resolve reject gt let data d
  • 动态速度计 javascript 或 jquery 插件

    我希望有动态ajax插件在页面上显示速度计 一个想法是我设置一个背景并旋转针 有人知道相关插件吗 这里有一些供您参考 http bernii github com gauge js http bernii github com gauge
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • 如何仅在 NextJS 站点构建期间使用 getInitialProps?

    当使用 NextJS 构建静态站点时 我想要getInitialProps方法仅在构建步骤期间触发 而不是在客户端上触发 在构建步骤中 NextJS 运行getInitialProps 方法 https nextjs org docs fe
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • Leaflet js虚构地图

    我是 Leaflet 的新手 我想了解如何创建完全交互式的虚构地图 我有一张图像想要转换为传单地图 该图像基本上像图表一样具有许多连接和点 我想首先将该图像转换为地图 能够将鼠标悬停在这些点上 突出显示它们并显示有关它们的信息 并且还可以在
  • 使用 CryptoJS 更改密钥 [重复]

    这个问题在这里已经有答案了 我正在使用 CryptoJS 来加密和解密文本 在这里 我只是获取消息并显示加密和解密消息 我使用DES算法进行加密和解密 这是我的 HTML 文件
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • 如何使用 JavaScript 获取没有 HTML 元素的纯文本?

    我的 HTML 中有 1 按钮和一些文本 如下所示 function get content I don t know how to do in here
  • Google Chrome 106 可拖动导致元素消失

    使用拖放元素时 绝对定位元素中包含的大多数其他元素都会从屏幕上消失 如果我调整窗口大小 这些元素会出现 但在开始拖动时会再次消失 我在最新版本的 Google Chrome 106 和 Beta 版本 107 0 5304 18 以及现在的
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没

随机推荐

  • 系统修复模式(Recovery mode) 的体验

    什么是修复模式 直观的体验就是在你的normal mode失败的时候 你发现在你的启动页面 和grub有关 有另一种选项就是recovery mode 具体的定义可以搜索百度或其他 为什么在其他启动失败的时候 修复模式能进入系统 我的经历是
  • Spring MVC静态资源处理

    优雅REST风格的资源URL不希望带 html 或 do 等后缀 由于早期的Spring MVC不能很好地处理静态资源 所以在web xml中配置DispatcherServlet的请求映射 往往使用 do xhtml等方式 这就决定了请求
  • 2023年十大最佳自动化测试工具

    Best Automation Testing Tools for 2023 对更快交付高质量软件 或 快速质量 的需求要求组织以敏捷 持续集成 CI 和DevOps方法论来寻找解决方案 测试自动化是这些方面的重要组成部分 最新的 2018
  • 合并DataGrid单元格

    做项目有时也会遇到要合并DataGrid单元格的情况 在DataGrid单元格中有ColumnSpan RowSpan Visible属性 这跟Table控件中的colspan rowspan属性相同 因此我们可以利用这些属性来合并Data
  • 前端例程20221012:宣纸材质背景

    演示 原理 使用 background image 加载材质图片 材质图片使用半透明的灰度图像 使用 background color 进行染色 代码
  • 在IDEA集成Github

    在IDEA集成Github 在IDEA中设置Git 在File gt Setting gt Version Control gt Git gt Path to Git executable选择你的git安装后的git exe文件 然后点击T
  • OC_YYModel字典转模型的几种详细用法

    OC YYModel字典转模型的几种详细用法 目录 JSON转字符串 普通字典转模型 模型属性有自定义的模型YYUSer 属性有数组 数组里自定义模型 还有字典和集合 字典里的key与模型里的属性名不一致 常用的几个方法 json转模型 i
  • 以太坊分片Sharding FAQ

    简介 目前 在所有的区块链协议中每个节点存储所有的状态 账户余额 合约代码和存储等等 并且处理所有的交易 这提供了大量的安全性 但极大的限制了可扩展性 区块链不能处理比一个单节点更多的交易 很大程度上因为这个原因 比特币被限制在每秒3 7笔
  • 【Linux篇】第八篇——Linux下的进程控制(进程创建+进程终止+进程等待+进程程序替换+简易shell的实现)

    这篇博客就要开始聊一聊进程控制相关的内容了 这部分的内容十分的丰富且十分的重要 学好这一块内容是非常有必要的 目录 进程创建 fork函数 写时拷贝 进程终止 进程退出的三种场景 进程常见的退出方法 进程等待 进程等待的方法 wait方法
  • Unity 实用小技巧合集

    Unity小技巧介绍 一 Unity小技巧介绍 二 Unity小技巧介绍 三 Unity小技巧介绍 四
  • 用canvas绘制微信小程序海报页面并保存相册-适用微信原生

    微信小程序绘制海报并保存相册 tip 代码中使用的是uni的api 如果使用原生微信小程序开发 可以把uni更换成wx使用 文章目录 微信小程序绘制海报并保存相册 前言 一 分析需求 二 准备数据 三 编码开始 html部分 解析 js部分
  • Python中使用xpath获取select option的每一行的text和value

    原数据内容如下
  • 设计模式--适配器模式

    适配器模式属于结构型模式 基本原理 根据不同的需求 使用一个适配器去寻找应对的方法 主要流程 1 创建解决方法的类 2 创建一个适配器 根据不同需求对应相应的解决方法 3 使用一个类去分配适配器 注意 适配器不是在详细设计时添加的 而是解决
  • C语言本身是用什么语言写的?

    先说结论 C语言由B语言编写 B语言是由A语言编写 A B C 好了 不开玩笑了 既然你能提出这个级别的问题 说明你应该学过C 既然你能提出这个级别的问题 说明你没学过编译原理 或者全还给老师了 容我不厚道一下下 你所谓的 C语言 准确来说
  • 基于 Flink CDC 高效构建入湖通道

    本文整理自阿里云 Flink 数据通道负责人 Flink CDC 开源社区负责人 Apache Flink PMC Member Committer 徐榜江 雪尽 在 Streaming Lakehouse Meetup 的分享 内容主要分
  • 免费虚拟局域网(VLAN)组建教程

    虚拟局域网 VLAN 是一组逻辑上的设备和用户 这些设备和用户并不受物理位置的限制 可以根据功能 部门及应用等因素将它们组织起来 相互之间的通信就好像它们在同一个网段中一样 由此得名虚拟局域网 虚拟局域网在日常的工作生活中 起着非常大的作用
  • superset的docker安装配置和汉化

    1 docker拉去superset镜像 docker pull amancevice superset 2 启动容器 1 启动容器 docker run d p 8188 8088 name superset v opt docker s
  • 【Latex排版】使用Latex 排版过程中的那些一二三问题汇总

    排版错误问题总结 1 在 maketitle 位置处报错 Missing inserted 2 添加参考文献 编译后显示错误 并且pdf中引用文献处为问号 持续更新问题 近期用Latex整理期刊论文时遇到了不少问题 现把遇到的问题及最终解决
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • React 深度学习:Fiber-ReactFiberLazyComponent

    ReactLazyComponent 包 packages shared ReactLazyComponent js Copyright c Facebook Inc and its affiliates This source code