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

Next.js非页面子组件如何实现类似getStaticProps的服务端缓存请求

解决方案

方案1:页面层预取数据透传(Pages Router 通用首选)

  • 直接在首页的getStaticProps中同时获取产品数据和分类数据,把分类数据通过 props 传递给顶部菜单子组件即可,完全复用getStaticProps的静态生成+缓存能力,无额外请求,实现成本最低
  • 如果组件嵌套层级过深不想逐层透传,可以结合 React Context 把预取的分类数据全局注入,子组件直接消费即可

方案2:封装带静态缓存的API路由(适合多页面复用分类组件的场景)

  • 新建pages/api/categories.js路由,接口内请求分类数据后设置强缓存响应头:
export default async function handler(req, res) {
  // 配置缓存7天,单位为秒
  res.setHeader('Cache-Control', 's-maxage=604800, stale-while-revalidate')
  const categories = await fetch('你的分类数据源地址').then(r => r.json())
  res.status(200).json(categories)
}
  • 子组件内用 SWR 或者 React Query 请求该接口,两类工具库会自动缓存响应结果,同一用户多次访问只会发起一次请求;同时服务端 CDN 缓存会保证不同用户请求时不会重复回源拉取分类数据,效果和getStaticProps完全一致

方案3:App Router(Next.js 13+)原生支持

  • 直接把分类菜单组件标记为服务端组件,在组件内直接发起请求,Next.js 会自动对服务端组件的请求结果做静态缓存,效果和getStaticProps完全一致,不需要额外处理:
// app/components/Nav.js 默认是服务端组件
async function Nav() {
  // 该请求会在构建时执行,结果自动静态缓存
  const categories = await fetch('你的分类数据源地址', { cache: 'force-cache' }).then(r => r.json())
  return <menu>{categories.map(cat => <div key={cat.id}>{cat.name}</div>)}</menu>
}
export default Nav

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:18:02