next.js 全局布局组件中的getInitialProps

next.js getInitialProps in a global layout component

我正在使用 next.js 构建一个网站,并且我正在努力思考以下 "problem"。我有一些静态数据(网站文本)需要从 API 端点(无头 CMS)获取。

对于个别页面,我使用 getInitialProps 来获取所需的数据。但是,我的主布局中也有一个 Footer 组件。 layout 和 Footer 组件都没有 getInitialProps 的解决方案,那么"nice"如何处理呢?

我想到的一些解决方案:

  1. 我可以使用 componentDidMount 在客户端获取页脚组件中的数据(但我真的想要服务器获取/使其静态化)。
  2. 将页脚移动到每个页面并提供 getInitialProps,添加一些 HOC 以防止重写所有代码。
  3. 正如我所说,数据是静态的,因此可以通过 server.js 或 _document.js 使其在全球范围内可用(虽然我不知道如何完成此操作)。

任何人都可以指出我正确的方向吗?

您可以将页眉和页脚组件放在 _app.js 中。

首先,在 App.getInitialProps 中,获取任何数据或执行您需要在服务器端发生的任何操作。然后,您 return 可以 return 将此数据与 Component.getInitialProps 的结果(您的页面组件的 getInitialProps)相结合 return。

static async getInitialProps({ Component, ctx }) {
  let pageProps = {};

  // Make any initial calls we need to fetch data required for SSR
  const isAuthed = await ctx.reduxStore.dispatch(checkAuth());

  // Load the page getInitiaProps
  if (Component.getInitialProps) {
    pageProps = await Component.getInitialProps({ isAuthed, ...ctx });
  }

  return { pageProps: { ...pageProps, isAuthed } };
  // Or, if the async data is separate from your page props:
  // { pageProps, data: { isAuthed } };
}

在您的渲染函数中,您可以访问 this.props.pageProps(或 this.props.data,如果您将其分开)。然后您可以将其传递给页眉和页脚。

<Header {...pageProps} />
  <main>
    <Component {...pageProps} />
  </main>
<Footer {...pageProps} />