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

NextJS中getStaticProps()方法从未被调用问题求助

问题根源

getStaticProps 是 Next.js 专为pages 目录下的路由页面组件设计的服务端数据获取API,仅对pages文件夹下的页面默认导出生效,普通业务组件、子组件中导出的getStaticProps不会被框架触发,和你使用TypeScript、自定义_app.tsx没有关联。


解决方案1:将数据获取逻辑移到父页面

找到你引用<Projects />组件的父页面(一般是pages/目录下的路由文件,比如首页pages/index.tsx),在父页面中定义getStaticProps获取数据,再把数据通过props传递给Projects组件:
父页面示例代码:

import { GetStaticProps } from 'next'
import Projects from '../components/Projects'

type RawProject = {
    owner: string;
    repo: string;
    link: string;
    description: string;
    language: string;
    stars: number;
    forks: number;
}

export default function Home({projects} : {projects: RawProject[]}) {
  return (
    <div>
      {/* 其他页面内容 */}
      <Projects projects={projects} />
    </div>
  )
}

export const getStaticProps: GetStaticProps = async () => {
  console.log("getStaticProps()");
  const res = await fetch("https://gh-pinned-repos-5l2i19um3.vercel.app/?username=ythepaut");
  const projects: RawProject[] = await res.json();
  return !projects ? {notFound: true} : {
      props: {projects: projects},
      revalidate: 3600
  };
}

调整Projects组件,去掉内部的getStaticProps,直接接收父组件传递的props即可:

import React from "react";

type RawProject = {
    owner: string;
    repo: string;
    link: string;
    description: string;
    language: string;
    stars: number;
    forks: number;
}

type ProjectsProps = {
  projects: RawProject[]
}

function Projects({projects}: ProjectsProps) {
    console.log(projects);
    return (
        <section id="projects" className="bg-white p-6 lg:p-20">
            <h1 className="sm:text-4xl text-2xl font-medium title-font mb-4 text-gray-900 pb-6 text-center">
                Quelques de mes projets
            </h1>
            <div className="container px-5 mx-auto">
                <div className="flex flex-wrap">
                    {projects.map((project: RawProject) => (
                        <ProjectCard
                            key={project.repo}
                            title={project.repo}
                            language={project.language}
                            description={project.description}
                            imageUrl="https://dummyimage.com/720x400"
                            repoUrl={project.link}
                        />
                    ))}
                </div>
            </div>
        </section>
    );
}

export default Projects;

解决方案2:组件内客户端获取数据

如果你不想把数据逻辑放在父页面,可以选择在组件内用客户端方式获取数据,推荐用SWR或者React Query这类请求库,也可以直接用useEffect实现:

import React, { useEffect, useState } from "react";

type RawProject = {
    owner: string;
    repo: string;
    link: string;
    description: string;
    language: string;
    stars: number;
    forks: number;
}

function Projects() {
    const [projects, setProjects] = useState<RawProject[]>([])
    const [loading, setLoading] = useState(true)

    useEffect(() => {
        const fetchProjects = async () => {
            const res = await fetch("https://gh-pinned-repos-5l2i19um3.vercel.app/?username=ythepaut");
            const data = await res.json()
            setProjects(data)
            setLoading(false)
        }
        fetchProjects()
    }, [])

    if(loading) return <div>加载中...</div>

    return (
        <section id="projects" className="bg-white p-6 lg:p-20">
            <h1 className="sm:text-4xl text-2xl font-medium title-font mb-4 text-gray-900 pb-6 text-center">
                Quelques de mes projets
            </h1>
            <div className="container px-5 mx-auto">
                <div className="flex flex-wrap">
                    {projects.map((project: RawProject) => (
                        <ProjectCard
                            key={project.repo}
                            title={project.repo}
                            language={project.language}
                            description={project.description}
                            imageUrl="https://dummyimage.com/720x400"
                            repoUrl={project.link}
                        />
                    ))}
                </div>
            </div>
        </section>
    );
}

export default Projects;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:18:04