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 节点并最终进行渲染。

相关推荐

  1. React

    2024-06-15 15:48:02       44 阅读
  2. React和Vue实现路由

    2024-06-15 15:48:02       60 阅读
  3. React和Vue实现路由

    2024-06-15 15:48:02       52 阅读
  4. React和Vue实现路由

    2024-06-15 15:48:02       52 阅读
  5. react组件

    2024-06-15 15:48:02       40 阅读
  6. ReactReact组件lazy和Suspense

    2024-06-15 15:48:02       31 阅读
  7. 关于如何实现图片

    2024-06-15 15:48:02       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-15 15:48:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-15 15:48:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-15 15:48:02       82 阅读
  4. Python语言-面向对象

    2024-06-15 15:48:02       91 阅读

热门阅读

  1. js字符串域名把域名前缀剪切掉

    2024-06-15 15:48:02       19 阅读
  2. Html_Css问答集(6)

    2024-06-15 15:48:02       24 阅读
  3. python的random模块三choices和shuffle()

    2024-06-15 15:48:02       27 阅读
  4. 表的删除与更新

    2024-06-15 15:48:02       28 阅读
  5. SQL Auto Increment

    2024-06-15 15:48:02       18 阅读
  6. select简单查询

    2024-06-15 15:48:02       27 阅读
  7. C++ 设计模式

    2024-06-15 15:48:02       32 阅读