主分支
分支
主分支 (6.23.1)开发分支
版本
6.23.1v4/5.xv3.x
StaticRouterProvider
本页内容

<StaticRouterProvider>

<StaticRouterProvider> 接受来自 createStaticRouter()router 和来自 createStaticHandler()context,并在服务器(例如 Node 或其他 Javascript 运行时)上渲染您的应用程序。有关更完整的概述,请参阅 服务器端渲染 指南。

import {
  createStaticHandler,
  createStaticRouter,
  StaticRouterProvider,
} from "react-router-dom/server";
import Root, {
  loader as rootLoader,
  ErrorBoundary as RootBoundary,
} from "./root";

const routes = [
  {
    path: "/",
    loader: rootLoader,
    Component: Root,
    ErrorBoundary: RootBoundary,
  },
];

export async function renderHtml(req) {
  let { query, dataRoutes } = createStaticHandler(routes);
  let fetchRequest = createFetchRequest(req);
  let context = await query(fetchRequest);

  // If we got a redirect response, short circuit and let our Express server
  // handle that directly
  if (context instanceof Response) {
    throw context;
  }

  let router = createStaticRouter(dataRoutes, context);
  return ReactDOMServer.renderToString(
    <React.StrictMode>
      <StaticRouterProvider
        router={router}
        context={context}
      />
    </React.StrictMode>
  );
}

类型声明

declare function StaticRouterProvider(props: {
  context: StaticHandlerContext;
  router: Router;
  hydrate?: boolean;
  nonce?: string;
}: JSX.Element;

context

这是从 createStaticHandler().query() 调用返回的 context,其中包含请求的所有已获取数据。

router

这是通过 createStaticRouter 创建的路由器。

hydrate

默认情况下,<StaticRouterProvider> 会将所需的 hydration 数据字符串化到 window.__staticRouterHydrationData 中的 <script> 标签中,该标签将被 createBrowserRouter() 读取并自动 hydration。

如果您希望手动进行更高级的 hydration,可以传递 hydrate={false} 来禁用此自动 hydration。在客户端,您随后会将自己的 hydrationData 传递给 createBrowserRouter

nonce

在利用自动 hydration 时,您可以提供一个 nonce 值,该值将被渲染到 <script> 标签上,并与您的 内容安全策略 一起使用。

另请参阅