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

Next.js 13中React Server Component构建后如何实现请求时重载数据?

解决方法

问题出在你的组件被静态生成(SSG)优化了,导致数据只在构建时获取一次。要让这个Server Component每次收到GET请求都重新拉取数据,不用转成客户端组件,只要强制它每次请求都在服务器端重新渲染就行,具体方法如下:

两种实现方式(以Next.js App Router为例)

1. 显式开启动态渲染

在组件文件顶部添加export const dynamic = 'force-dynamic',直接强制组件每次请求都重新执行:

import prisma from "@/lib/prisma";

// 强制组件动态渲染,每次请求都重新拉取数据
export const dynamic = 'force-dynamic';

export default async function AdminNewsSourceList() {
  const dataNewsSource = await prisma.newsSource.findMany();

  return (
    <div className="container">
      <h1 className="my-3">News Sources</h1>
      <table className="table table-striped">
        {/* ... 表格内容 ... */}
      </table>
    </div>
  );
}

2. 通过请求上下文触发动态渲染

如果不想写配置,可以在组件里调用Next.js的headers()或cookies()函数——这些函数依赖请求上下文,会自动触发动态渲染,不需要额外配置:

import prisma from "@/lib/prisma";
import { headers } from 'next/headers';

export default async function AdminNewsSourceList() {
  // 调用headers()触发动态渲染,无需实际使用返回值
  headers();
  
  const dataNewsSource = await prisma.newsSource.findMany();

  return (
    <div className="container">
      <h1 className="my-3">News Sources</h1>
      <table className="table table-striped">
        {/* ... 表格内容 ... */}
      </table>
    </div>
  );
}

原理说明

在Next.js的App Router里,Server Component默认会做静态优化:如果组件不依赖请求相关内容(比如请求头、Cookie),就会在构建时预渲染并缓存结果。上面两种方法,要么直接强制动态渲染,要么通过引入请求上下文让Next.js识别到组件需要每次请求都重新生成,这样用户每次访问页面时,服务器都会重新执行prisma.newsSource.findMany(),拿到最新数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:37:34