使用 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;
相关推荐
绅士玖几秒前
🍪 前后端相连小项目实战:Cookic的作用
前端·后端
WildBlue几秒前
流式输出:前端工程师的魔术表演,小白也能看懂!🎩✨
前端·javascript·node.js
labixiong2 分钟前
面试官:从「敲下一个 URL」到「页面出现在屏幕」都经历了什么?
前端·面试
小山不高3 分钟前
react封装指令式组件
前端·react.js
爱学习的茄子3 分钟前
深入解析React事件机制:从原生DOM到合成事件的演进
前端·react.js·面试
Danny_FD3 分钟前
Vue2 中 `watch` 监听详解与 Vue3 的对比:深入理解监听器的使用与优化
前端·面试
多啦C梦a3 分钟前
React 事件机制大揭秘:从 addEventListener 到合成事件,别再一脸懵逼!
前端·javascript
不卷的攻城狮5 分钟前
【精通react】(四)如何避免react的闭包陷阱?
前端
一天睡25小时5 分钟前
一款减轻前端图片命名工作量的图片转换器
前端·javascript·html
我是若尘7 分钟前
前端攻城狮必须知道的 - HttpOnly Cookie
前端