我使用的是Next.js 13&Strapi,我想用getStaticProps制作一个Menu组件.

我在_app.js中创建并添加了一个Layout组件. 以及Layout内部的Menu组件.

我测试了getStaticProps内部的代码,它返回预期的json响应.

_app.js:

import '../styles/globals.css'
import 'bootstrap/dist/css/bootstrap.css'
import Layout from './components/Layout'

export default function App({ Component, pageProps }) {
  return (
    <Layout>
      <Component {...pageProps} />
    </Layout>
  )
}

Layout.js

import Menu from './Menu'
import Footer from './Footer'

export default function Layout({ children}) {

  return (
    <>
      <Menu />
      <main>{children}</main>
      <Footer />
    </>
  )
}

Menu.js:

const Menu = async ({ dataMenu }) => {

  console.log(dataMenu);

  const renderMenuItems = (items) => {
    return items.map((item) => (
      <li key={item.id}>
        <Link href={item.attributes.url}>
          <a>{item.attributes.title}</a>
        </Link>
        {item.attributes.children.data.length > 0 && (
          <ul>{renderMenuItems(item.attributes.children.data)}</ul>
        )}
      </li>
    ));
  };

  return (
    <nav>
      <ul>{renderMenuItems(dataMenu)}</ul>
    </nav>
  );
};

export async function getStaticProps() {
  const urlParamsObject = {
    nested: "",
    populate: "*",
  }
  const queryString = qs.stringify(urlParamsObject);
  const { data } = await api.get(`/menus/1${queryString ? `?${queryString}` : ""}`);
  const dataMenu = data.data;

  return { props: { dataMenu } };
}

当我try 对dataMenu个数据进行console.log()次运算时,我得到了undefined个数据.谁能告诉我为什么我会期待这个问题? 谢谢.

推荐答案

getStaticProps仅适用于pages文件夹内的页面组件. 以下是这doc人所说的:

只能从page导出getStaticProps.您可以cannot从非页面文件_app_document_error中导出它.

要保持当前的 struct ,只需调用Menu一次,并在服务器上呈现,您可以做的就是使用getInitialProps获取_app中的菜单数据,并将其作为props 传递给Layout,然后传递给Menu,如下所示.

_app.js:

import '../styles/globals.css'
import 'bootstrap/dist/css/bootstrap.css'
import Layout from './components/Layout'
import App from "next/app";

export default function MyApp({ Component, pageProps, dataMenu }) {
  return (
    <Layout dataMenu={dataMenu}>
      <Component {...pageProps} />
    </Layout>
  )
}

MyApp.getInitialProps = async (context) => {
  const urlParamsObject = {
    nested: "",
    populate: "*",
  }
  const queryString = qs.stringify(urlParamsObject);
  const { data } = await api.get(`/menus/1${queryString ? `?${queryString}` : ""}`);
  const dataMenu = data.data;
  const pageProps = await App.getInitialProps(context);

  return { ...pageProps, dataMenu: dataMenu};
};

Layout.js:

import Menu from './Menu'
import Footer from './Footer'

export default function Layout({ children, dataMenu}) {

  return (
    <>
      <Menu dataMenu={dataMenu} />
      <main>{children}</main>
      <Footer />
    </>
  )
}

Menu.js:

const Menu = async ({ dataMenu }) => {

  console.log(dataMenu);

  const renderMenuItems = (items) => {
    return items.map((item) => (
      <li key={item.id}>
        <Link href={item.attributes.url}>
          <a>{item.attributes.title}</a>
        </Link>
        {item.attributes.children.data.length > 0 && (
          <ul>{renderMenuItems(item.attributes.children.data)}</ul>
        )}
      </li>
    ));
  };

  return (
    <nav>
      <ul>{renderMenuItems(dataMenu)}</ul>
    </nav>
  );
};

⚠️:确保从正确的位置导入所有内容.

Javascript相关问答推荐

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

使用useup时,React-Redux无法找到Redux上下文值

Vega中的模运算符

硬币兑换运行超时

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

在nextjs服务器端api调用中传递认证凭证

使用JQuery单击元素从新弹出窗口获取值

使用ThreeJ渲染的形状具有抖动/模糊的边缘

在WordPress中使用带有WPCode的Java代码片段时出现意外令牌错误

从页面到应用程序(NextJS):REST.STATUS不是一个函数

变量在导入到Vite中的另一个js文件时成为常量.

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

为什么在函数中添加粒子的速率大于删除粒子的速率?

不同表的条件API端点Reaction-redux

Refine.dev从不同的表取多条记录

如何调整下拉内容,使其不与其他元素重叠?

如果我将高度设置为其内容的100%,则在Java脚本中拖动以调整面板大小时会冻结

Google OAuth 2.0库和跨域开放程序的问题-策略错误

响应,Use Callback更新状态变量,该变量也存在于其依赖数组中,它如何防止无限重新呈现?

如何让noWrap在嵌套在Alert/AlertTitle组件中的排版组件中工作?