返回

Suspense和SWR的多样用法与编程哲学

前端

今天主要讲Suspense和SWR在react中是如何使用的,以及它们的编程思想是什么。

Suspense

Suspense的基本用法

React 16.6 添加了一个 组件,可以用来在 lazy load 的时候显示加载中的状态。 后来 React 想,这 Suspense 既然能用来等待 lazy load 的 Promise,那它能不能等待别的呢?所以,React 从 18 开始,Suspense 就支持等待更多的异步操作了。

我们先来看一下 Suspense 的基本用法。

import React, { Suspense } from 'react';

const MyComponent = React.lazy(() => import('./MyComponent'));

const App = () => {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <MyComponent />
      </Suspense>
    </div>
  );
};

在这个例子中,我们使用了 React.lazy 来延迟加载 MyComponent 组件。当 App 组件渲染时,MyComponent 组件还没有加载完成,所以 Suspense 会显示 fallback 内容。当 MyComponent 组件加载完成后,Suspense 会自动重新渲染,并显示 MyComponent 组件。

Suspense的进阶用法

除了基本用法之外,Suspense 还有很多进阶的用法。

Suspense 可以用来等待多个异步操作。例如,我们可以使用以下代码来等待两个异步操作:

const MyComponent1 = React.lazy(() => import('./MyComponent1'));
const MyComponent2 = React.lazy(() => import('./MyComponent2'));

const App = () => {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <MyComponent1 />
        <MyComponent2 />
      </Suspense>
    </div>
  );
};

在这个例子中,Suspense 会等待 MyComponent1 和 MyComponent2 两个组件都加载完成后再显示它们。

Suspense 可以用来显示错误边界。例如,我们可以使用以下代码来显示一个错误边界:

const MyComponent = React.lazy(() => import('./MyComponent'));

const App = () => {
  return (
    <div>
      <Suspense fallback={<div>Error</div>}>
        <MyComponent />
      </Suspense>
    </div>
  );
};

在这个例子中,如果 MyComponent 组件加载失败,Suspense 会显示错误边界。

SWR

SWR的基本用法

SWR 是一个 React Hook,可以用来在 React 组件中轻松地管理异步状态。SWR 的基本用法非常简单,只需要以下几步:

  1. 导入 SWR Hook:
import { SWRConfig, useSWR } from 'swr';
  1. 在 SWRConfig 组件中包裹你的 React 应用:
const App = () => {
  return (
    <SWRConfig value={{ fetcher: fetch }}>
      {/* 你的 React 应用 */}
    </SWRConfig>
  );
};
  1. 使用 useSWR Hook 来获取异步数据:
const { data, error } = useSWR('/api/users');

在这个例子中,useSWR Hook 会向 /api/users 端点发送一个 GET 请求,并将响应数据存储在 data 变量中。如果请求失败,useSWR Hook 会将错误信息存储在 error 变量中。

SWR的进阶用法

除了基本用法之外,SWR 还有很多进阶的用法。

SWR 可以用来缓存异步数据。例如,我们可以使用以下代码来缓存异步数据:

const { data, error } = useSWR('/api/users', { cache: true });

在这个例子中,useSWR Hook 会将 /api/users 端点的响应数据缓存起来。当组件再次渲染时,useSWR Hook 会直接从缓存中获取数据,而不会再次向服务器发送请求。

SWR 可以用来并行发送多个异步请求。例如,我们可以使用以下代码来并行发送多个异步请求:

const { data1, error1 } = useSWR('/api/users');
const { data2, error2 } = useSWR('/api/posts');

在这个例子中,useSWR Hook 会同时向 /api/users 和 /api/posts 端点发送两个 GET 请求。当两个请求都完成时,useSWR Hook 会将两个响应数据分别存储在 data1 和 data2 变量中。

Suspense和SWR的编程思想

Suspense 和 SWR 都是 React 中非常强大的工具,它们可以帮助我们轻松地管理异步状态。这两种工具的编程思想都是一样的,那就是:

  • 将异步操作抽象为组件。
  • 使用组件来管理异步状态。
  • 通过渲染组件来显示异步数据。

这种编程思想的好处有很多。首先,它可以使我们的代码更易于理解和维护。其次,它可以使我们的代码更易于测试。第三,它可以使我们的代码更易于重用。

Suspense和SWR都是非常强大的工具,只要我们能够理解它们的编程思想,并熟练地使用它们,就可以开发出非常复杂的React应用。