使用 Suspense 处理请求状态

React Suspense 是 React 16.6 引入的一个特性,它允许组件在渲染之前"等待"某些条件满足,并且能够指定一个加载状态(如旋转的加载指示器),在这个条件满足之前展示给用户。这项特性最初设计用来处理组件的懒加载和代码分割,但随着 React 18 版本的发布,其用途被扩展到数据获取的场景。

Suspense 的作用:

  1. 代码分割: 允许组件的动态导入,实现代码分割,减少初始加载时间。
  2. 数据获取: 和新的 Concurrent 特性一起使用,Suspense 能够在数据获取时显示回退(fallback)内容,等数据加载完成后再渲染组件。
  3. 资源预加载: 可以配合 React.lazy 使用,提前加载组件资源。

使用示例

在React中创建一个自定义的接口请求方法,可以使用Suspense来处理数据加载的状态,你可以创建一个能够抛出promise并将数据缓存起来的函数。以下是一个简单的示例:

代码示例:

tsx 复制代码
import { Suspense } from "react";

const promise = new Promise<string>((resolve) => {
  setTimeout(() => {
    resolve("data");
  }, 2000);
});

const createResource = (promise: Promise<string>) => {
  let status = "loading";
  let data: string;

  const result = promise.then(
    (res) => {
      data = res;
      status = "success";
    },
    (err) => {
      console.error(err);
      status = "error";
    }
  );

  return {
    read: () => {
      if (status === "loading") {
        throw result;
      } else if (status === "error") {
        throw data;
      } else if (status === "success") {
        return data;
      }
    },
  };
};

const resource = createResource(promise);

const Welcome = () => {
  console.log("Welcome");

  const data = resource.read();

  console.log("data", data);

  return <div>welcome: {data}</div>;
};

const Page = () => {
  console.log("Page");

  return (
    <Suspense fallback={<div>loading...</div>}>
      <Welcome />
    </Suspense>
  );
};

export default Page;
相关推荐
Curvatureflight9 小时前
前端国际化 i18n 落地实践:语言包、动态文案和格式化问题怎么处理?
前端·c++·vue
kTR2hD1qb9 小时前
Claude Code Skill的介绍与使用
java·前端·数据库·人工智能
修己xj10 小时前
打造专属博文封面神器:一个开源免费的博文封面生成器ThisCover
前端
kyriewen10 小时前
面试8家前端岗位后,我发现了一个残酷的事实:AI不是加分项,是门槛
前端·javascript·面试
Fighting_p10 小时前
【面试 - el-select问题及解决】wujie 微前端下子系统 el-select 多选 filterable 过滤失效
前端
吃口巧乐兹10 小时前
AI 全栈时代,为什么要服务端使用 NestJs
前端
yingyima11 小时前
Redis 延迟任务队列:凌晨3点服务器报警的救星
前端
weiggle11 小时前
第三篇:可组合函数(Composable)——Compose 的基石
android·前端
前端环境观察室11 小时前
别只看 task success:AI Agent 浏览器自动化真正要补的是环境证据链
前端·后端
huakoh11 小时前
LangChain 实战:用混合检索啃下 1000 页 PDF,搭一个长文档问答 Agent
前端