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

Next.js单页项目中使用getStaticProps如何拆分index.tsx?

无路由单页Next.js项目拆分代码并保留getStaticProps的方案

核心思路

Next.js 的 getStaticProps 仅对 pages 目录下的页面入口文件(比如 pages/index.tsx)生效,普通组件无法直接使用该方法获取数据。要拆分代码同时保持单页结构,核心是把UI模块和数据逻辑拆分,通过props传递数据。


1. 拆分UI组件,通过props传递数据

把 index.tsx 中不同功能模块拆成独立组件,放在 components 目录下(不要放在 pages 目录,避免被解析成独立路由),然后在 index.tsx 的 getStaticProps 中统一获取所有需要的数据,再传递给对应子组件。

示例代码:

  • 新建 components/Options.tsx:
interface OptionsProps {
  optionsData: Array<{ id: number; name: string }>;
}

export default function Options({ optionsData }: OptionsProps) {
  return (
    <div className="options-container">
      {optionsData.map(option => (
        <div key={option.id} className="option-item">
          {option.name}
        </div>
      ))}
    </div>
  );
}
  • 修改 pages/index.tsx:
import Options from '../components/Options';

// 统一在页面入口获取所有需要的数据
export async function getStaticProps() {
  // 获取Options组件需要的数据
  const optionsData = await fetch('https://your-api-endpoint/options')
    .then(res => res.json());
  
  // 可以同时获取其他模块的数据
  const otherModuleData = await fetch('https://your-api-endpoint/other')
    .then(res => res.json());

  return {
    props: {
      optionsData,
      otherModuleData
    }
  };
}

export default function Home({ optionsData, otherModuleData }) {
  return (
    <div className="app-container">
      {/* 传递数据给子组件 */}
      <Options optionsData={optionsData} />
      {/* 其他子组件 */}
      {/* <OtherModule data={otherModuleData} /> */}
    </div>
  );
}

2. 拆分数据获取逻辑(可选)

如果 getStaticProps 里的数据获取代码过多,可以把这部分逻辑抽成单独的工具函数,放在 lib 目录下,让代码结构更清晰。

示例:

  • 新建 lib/data-fetchers.ts:
export async function fetchOptionsData() {
  const res = await fetch('https://your-api-endpoint/options');
  if (!res.ok) throw new Error('Failed to fetch options data');
  return res.json();
}

export async function fetchOtherModuleData() {
  const res = await fetch('https://your-api-endpoint/other');
  if (!res.ok) throw new Error('Failed to fetch other data');
  return res.json();
}
  • 修改 pages/index.tsx:
import Options from '../components/Options';
import { fetchOptionsData, fetchOtherModuleData } from '../lib/data-fetchers';

export async function getStaticProps() {
  const optionsData = await fetchOptionsData();
  const otherModuleData = await fetchOtherModuleData();

  return {
    props: { optionsData, otherModuleData }
  };
}

export default function Home({ optionsData, otherModuleData }) {
  return (
    <div className="app-container">
      <Options optionsData={optionsData} />
      {/* <OtherModule data={otherModuleData} /> */}
    </div>
  );
}

为什么之前的方法无效?

pages 目录下的文件会被Next.js自动解析为路由页面,比如 pages/options.tsx 会对应 /options 路由。你在这个文件里使用 getStaticProps,数据只会传递给 /options 页面,而不是 index.tsx 中渲染的该组件,所以数据无法显示,这确实不符合Next.js的规范用法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:45:27