You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SSR场景下实现React Suspense组件的条件式启用?

实现可禁用的条件式Suspense组件

React原生Suspense组件没有内置的启用/禁用开关,要实现「禁用时像普通div一样在服务器端同步加载」的效果,我们可以封装自定义组件,通过*enabled*属性控制是否触发Suspense的异步等待逻辑:

import React, { Suspense, ReactElement } from 'react';

function ConditionalSuspense({ enabled = true, children }: { enabled?: boolean; children: React.ReactNode }): ReactElement {
  // 禁用状态下直接渲染子内容,跳过Suspense等待逻辑
  if (!enabled) {
    return <>{children}</>;
  }
  // 启用状态下渲染原生Suspense组件
  return <Suspense>{children}</Suspense>;
}

使用示例

在业务组件中,通过enabled={false}让外层内容在服务器端用renderToPipeableStream时直接同步输出,内部嵌套的原生Suspense仍保持客户端异步加载特性:

function MyPage(): ReactElement {
  return (
    <ConditionalSuspense enabled={false}>
      <div>
        <div>此内容会在服务器端同步加载,因为外层ConditionalSuspense已禁用</div>
        {/* 内部原生Suspense不受外层控制,依然保持客户端异步加载 */}
        <Suspense fallback={<div>加载中...</div>}>
          {/* 此处可放置React.lazy导入的异步组件 */}
        </Suspense>
      </div>
    </ConditionalSuspense>
  );
}

服务器端渲染代码

使用renderToPipeableStream渲染时,禁用状态的ConditionalSuspense会直接输出子内容,不会触发Suspense等待,实现立即加载:

import { renderToPipeableStream } from 'react-dom/server';
import { MyPage } from './ui';

const stream = renderToPipeableStream(<MyPage />, {
  onShellReady() {
    stream.pipe(response);
  },
  // 其他服务器渲染配置...
});

内容的提问来源于stack exchange,提问作者Mateusz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:30:58