【问题标题】:How do we make Next.js Static Generation getStaticProps() to work on a component level?我们如何使 Next.js 静态生成 getStaticProps() 在组件级别上工作?
【发布时间】:2021-03-12 06:45:23
【问题描述】:

以下代码可以在构建时在 Home 组件级别获取数据时进行 Next.js 的静态生成:

export async function getStaticProps() {
  const dataAtBuild = await fetch(
    "https://api.weather.gov/gridpoints/MTR/84,105/forecast"
  ).then((res) => res.json());

  return {
    props: {
      dataAtBuild
    }
  };
}

演示:https://codesandbox.io/s/quirky-zhukovsky-l7wb9?file=/pages/index.js

并使用卷曲其输出

curl https://l7wb9.sse.codesandbox.io/ | grep -o -E '.{30}Time of.{60}'

可以显示

<p>Time of forecast: <!-- -->3/12/2021, 6:00:00 AM

在构建时生成。

但是,如果将代码 getStaticProps() 移动到组件 Weather 中,则它不能具有构建时间数据,如

演示:https://codesandbox.io/s/cool-night-08cz7?file=/pages/Weather.js

然后卷曲它:

curl https://08cz7.sse.codesandbox.io/ | grep -o -E '.{30}Time of.{60}'

在构建时无法再获取静态生成的内容。

如何让它在组件级别工作?

【问题讨论】:

    标签: reactjs next.js


    【解决方案1】:

    恐怕现在不可能,如果您想获取服务器端数据,那么只能在Page Component级别进行。

    引用:

    getStaticProps 只能从页面导出。不能从非页面文件中导出。

    这个限制的一个原因是React需要在页面被渲染之前拥有所有需要的数据。

    此外,您必须使用导出异步函数 getStaticProps() {} — 如果您将 getStaticProps 添加为页面组件的属性,它将不起作用。

    您也可以阅读what counts as Page Component

    React 发布服务器组件时可能会出现一些问题,我认为 React 团队与 NextJs 团队合作。

    https://github.com/reactjs/rfcs/pull/188

    【讨论】:

    • 必须是页面级别的吗?例如,如果 Page 显示 Info 并且 Info 显示 Weather 并将数据传递给 Weather,如果 Info 没有得到任何道具,Info 可以执行getStaticProps() 吗?如果它必须是页面级别,那么如果 2 个子组件正在获取数据,那么页面必须以某种方式获取两者并以某种方式将它们传递给子组件?您是 Next.js 团队的一员吗?因为这几天能得到3个人的3个意见,不知道哪个意见才是真正的答案
    • (在这些示例中,该组件不是称为Page,而是Home...我看不到其他页面使用名称PageHome...如何知道这是“根”组件吗?)
    • 这里是具体部分,来自文档nextjs.org/docs/basic-features/… 的解释我会更新答案
    • 但是是的,如果您的 Page 使用不同的数据呈现多个不同的组件,那么它应该为所有组件获取数据并以某种方式将其传递到树中(通常是使用 React 上下文完成)跨度>
    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 2021-03-31
    • 2021-04-27
    • 2021-04-01
    • 2021-12-11
    • 2020-10-29
    • 2020-10-29
    相关资源
    最近更新 更多