• react懒加载lazy


    lazy 能够让你在组件第一次被渲染之前延迟加载组件的代码。

    const SomeComponent = lazy(load)

    参考 

    lazy(load) 

    在组件外部调用 lazy,以声明一个懒加载的 React 组件:

    1. import { lazy } from 'react';
    2. const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));

    参数 
    • load: 一个返回 Promise 或另一个 thenable(具有 then 方法的类 Promise 对象)的函数。React 不会在你尝试首次渲染返回的组件之前调用 load 函数。在 React 首次调用 load 后,它将等待其解析,然后将解析值的 .default 渲染为 React 组件。返回的 Promise 和 Promise 的解析值都将被缓存,因此 React 不会多次调用 load 函数。如果 Promise 被拒绝,则 React 将抛出拒绝原因给最近的错误边界处理。
    返回值 

    lazy 返回一个 React 组件,你可以在 fiber 树中渲染。当懒加载组件的代码仍在加载时,尝试渲染它将会处于 暂停 状态。使用 可以在其加载时显示一个正在加载的提示。


    load 函数 

    参数 

    load 不接收任何参数。

    返回值 

    你需要返回一个 Promise 或其他 thenable(具有 then 方法的类 Promise 对象)。它最终需要解析为有效的 React 组件类型,例如函数、memoforwardRef 组件。


    使用方法 

    使用 Suspense 实现懒加载组件 

    通常,你可以使用静态 import 声明来导入组件:

    import MarkdownPreview from './MarkdownPreview.js';

    如果想在组件第一次渲染前延迟加载这个组件的代码,请替换成以下导入方式:

    1. import { lazy } from 'react';
    2. const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));

    此代码依赖于 动态 import(),因此可能需要你的打包工具或框架提供支持。使用这种模式要求导入的懒加载组件必须作为 default 导出。

    现在你的组件代码可以按需加载,同时你需要指定在它正在加载时应该显示什么。你可以通过将懒加载组件或其任何父级包装到 边界中来实现:

    1. <Suspense fallback={<Loading />}>
    2. <h2>Previewh2>
    3. <MarkdownPreview />
    4. Suspense>

    在这个例子中,MarkdownPreview 的代码只有在你尝试渲染它时才会被加载。如果 MarkdownPreview 还没有加载完成,将显示 Loading。请尝试勾选复选框:

    app.js

    1. import { useState, Suspense, lazy } from 'react';
    2. import Loading from './Loading.js';
    3. const MarkdownPreview = lazy(() => delayForDemo(import('./MarkdownPreview.js')));
    4. export default function MarkdownEditor() {
    5. const [showPreview, setShowPreview] = useState(false);
    6. const [markdown, setMarkdown] = useState('Hello, **world**!');
    7. return (
    8. <>
    9. <textarea value={markdown} onChange={e => setMarkdown(e.target.value)} />
    10. <label>
    11. <input type="checkbox" checked={showPreview} onChange={e => setShowPreview(e.target.checked)} />
    12. Show preview
    13. label>
    14. <hr />
    15. {showPreview && (
    16. <Suspense fallback={<Loading />}>
    17. <h2>Previewh2>
    18. <MarkdownPreview markdown={markdown} />
    19. Suspense>
    20. )}
    21. );
    22. }
    23. // 添加一个固定的延迟时间,以便你可以看到加载状态
    24. function delayForDemo(promise) {
    25. return new Promise(resolve => {
    26. setTimeout(resolve, 2000);
    27. }).then(() => promise);
    28. }

    Loading.js 

    1. export default function Loading() {
    2. return <p><i>Loading...i>p>;
    3. }

    MarkdownPreview.js

    1. import { Remarkable } from 'remarkable';
    2. const md = new Remarkable();
    3. export default function MarkdownPreview({ markdown }) {
    4. return (
    5. <div
    6. className="content"
    7. dangerouslySetInnerHTML={{__html: md.render(markdown)}}
    8. />
    9. );
    10. }

    这个示例代码人为地延迟了加载。在你下次取消选中并重新选中复选框时,Preview 将被缓存,因此不会出现加载状态。要再次查看加载状态,请在示例中单击“Reset”

    疑难解答 

    我的 lazy 组件状态意外重置 

    不要在其他组件 内部 声明 lazy 组件:

    1. import { lazy } from 'react';
    2. function Editor() {
    3. // 🔴 Bad: 这将导致在重新渲染时重置所有状态
    4. const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));
    5. // ...
    6. }

    相反,总是在模块的顶层声明它们:

    1. import { lazy } from 'react';
    2. // ✅ Good: 将 lazy 组件声明在组件外部
    3. const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));
    4. function Editor() {
    5. // ...
    6. }

  • 相关阅读:
    [附源码]计算机毕业设计JAVA个性化新闻推荐系统
    【AIFEM案例操作】水轮机转轮强度和模态分析
    Linux高负载排查最佳实践
    二叉树中和为某一值的路径(二)
    MFC Windows 程序设计[123]之文件浏览编辑框
    Flink部署 完整使用 (第三章)
    Hyperledger Besu环境搭建(Linux)
    linux 安装mysql8.0 超详细教程(实战多次)
    Hadoop的第二个核心组件:MapReduce框架第一节
    2023年【山东省安全员A证】考试内容及山东省安全员A证考试报名
  • 原文地址:https://blog.csdn.net/sunnyjingqi/article/details/134009437