使用 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;
相关推荐
讯方洋哥12 小时前
应用冷启动优化
前端·harmonyos
speedoooo12 小时前
未来的App不再需要菜单栏?
前端·ui·容器·小程序·web app
猿究院_xyz12 小时前
微信小程序与echarts联动安卓真机测试出现黑色阴影
前端·javascript·微信小程序·小程序·echarts
IT_陈寒13 小时前
Redis性能翻倍的5个冷门技巧,90%开发者都不知道的深度优化方案
前端·人工智能·后端
清水迎朝阳13 小时前
监听 edge大声朗读 样式变化
前端·edge
油丶酸萝卜别吃13 小时前
修改chrome配置,关闭跨域校验
前端·chrome
m0_7400437313 小时前
3、Vuex-Axios-Element UI
前端·javascript·vue.js
风止何安啊13 小时前
一场组件的进化脱口秀——React从 “类” 到 “hooks” 的 “改头换面”
前端·react.js·面试
JS_GGbond13 小时前
给数组装上超能力:JavaScript数组方法趣味指南
前端·javascript
前端无涯13 小时前
Tailwind CSS v4 开发 APP 内嵌 H5:安卓 WebView 样式丢失问题解决与降级实战
前端