尝试获取数据来创建菜单,getStaticProps 返回未定义

2023-12-21

我正在使用 Next.js 13 和 Strapi,我想做一个Menu组件使用getStaticProps.

我创建并添加了一个Layout组件中的_app.js. And a Menu里面的组件Layout.

我测试了里面的代码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>
  )
}

布局.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 } };
}

当我尝试console.log() the dataMenu我有数据undefined。有人可以告诉我为什么我会遇到这个问题吗? 谢谢。


getStaticProps仅适用于内部页面组件pages文件夹。 这是什么doc https://nextjs.org/docs/basic-features/data-fetching/get-static-props#where-can-i-use-getstaticprops says:

getStaticProps只能从page. You cannot从非页面文件导出它,_app, _document, or _error.

你可以做什么来保持你当前的结构,Menu调用一次,并在服务器上渲染是获取菜单数据_app using getInitialProps并将其作为道具传递给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};
};

布局.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>
  );
};

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试获取数据来创建菜单,getStaticProps 返回未定义 的相关文章

  • 删除旧版本的 create-react-app

    我想使用创建一个新的反应应用程序create react app脚本 我仍然安装了一个不再受支持的全局版本 因此我卸载了全局版本并尝试创建一个新版本 如下所示 npx create react app myapp 然后我得到了一个没有使用模
  • Javascript“this”在 IE 中丢失上下文

    以下在 firefox safari chrome 中工作正常 在 IE 中 this 似乎在 handleEvent 函数中丢失上下文 警报的结果是 object Window 这不是我想要的 当从handleEvent 输出时 this
  • 如何使用标准 JavaScript 在 CSS 转换结束后立即重新启动它?

    我构建了一种密码生成器 只要倒计时到期 它就会显示新密码 不幸的是 我只设法弄清楚如何运行我的代码一次 倒计时由一个简单的 CSS 过渡组成 我想保留它 因为它比我的其他尝试平滑得多 其中我尝试使用 JavaScript 重复更新宽度 va
  • CryptoJS 使用密码加密 AES,但 PHP 解密需要密钥

    我在用CryptoJS https code google com p crypto js AES加密字符串 function doHash msg msg String msg var passphrase aggourakia var
  • 有没有办法让 jslint 在 javascript 的下一行中使用大括号?

    我改变了我的编码风格 function getParams entity use strict var accountID store getItem AccountID switch entity case Topic to functi
  • “React”在定义之前就被使用了

    我正在使用 create react app typescript eslint 应用程序 在构建过程中出现这样的错误 Line 1 8 React was used before it was defined typescript esl
  • html 图像 src 调用 javaScript 变量

    这是我的代码 我想问 我怎样才能做到这一点 img src img apple 我一直在尝试使用 call 函数和 document onload 但它根本不起作用 有人可以救我吗 我假设你只是想用 javascript 更新图像 src
  • React Native Expo StackNavigator 重叠通知栏

    我正在尝试为我的 React Native Expo 应用程序实现导航栏 这里有一个问题 dependencies expo 18 0 3 react 16 0 0 alpha 12 react native 0 45 1 react na
  • Twitter Bootstrap - 下拉菜单 - 箭头键不适用于 Firefox 中的输入标签

    要求 我想在带有用户名和密码字段的下拉菜单中放置一个登录表单 我可以做到这一点 除了以下问题之外 一切正常 Issue 打字时我无法使用箭头键 上 下 firefox 当输入位于下拉代码之外时 这很有效 这适用于其他浏览器 例如 googl
  • 为动态加载的 HTML 内容触发 Bootstrap JS 行为

    我正在动态加载包含 Bootstrap 标记的 HTML 模板 但是 Bootstrap Javascript 行为不会应用于加载的内容 例如 如果加载的内容包含 Bootstrap 模式的标记 则该模式将无法正确运行 有没有办法可以触发
  • jquery 中可点击 div 中的按钮

    我有整个 div 您可以单击它来切换该 div 的主要部分 问题是我在该 div 中也有可点击的按钮 当我点击它时 它会执行它应该做的事情 但同时也会切换整个 div 我怎样才能禁用它 Use event stopPropagation 单
  • 将文本字段限制为仅包含数字的最佳方法?

    I m using the following Javascript to restrict a text field on my website to only accept numerical input and no other le
  • JQuery $.ajax() 在 java servlet 中发布数据

    我想将数据发送到 java servlet 进行处理 数据将具有可变长度并采用键 值对 A1984 1 A9873 5 A1674 2 A8724 1 A3574 3 A1165 5 数据不需要这样格式化 这就是我现在的方式 var sav
  • ES6 静态方法引用 self? [复制]

    这个问题在这里已经有答案了 我有两节课 存储库和用户存储库 我想在 Repository 中定义一个静态方法 该方法在运行时调用 UserRepository 中的静态函数 有什么干净的方法可以做到这一点吗 class Repository
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • 如何使用 Javascript 在 html 文件中搜索字符串?

    我有 5 个 html 文件 并且有一个搜索表单 我想用它来搜索这些 html 文件中的文本
  • 如何为 React 组件参数创建文字类型?

    我创建了 SelectProps 界面 export interface SelectProps value string options string onChange value any gt void 我创建了反应组件
  • 如何将数据推送到嵌套对象

    如何将另一个元素推入variables来自以下对象的属性 var request name Name id 3 rules name Rule name tags tagId 1 variables variable var1 matchT
  • ‘state’未定义 no-undef

    我使用教程来学习 React 但我很快就陷入困境 在教程中 他们使用以下代码 import React Component from react class Counter extends Component state count 0 r
  • Safari 扩展将消息发送到特定选项卡

    有没有办法从全局页面发送消息到特定选项卡 我目前正在做的是 在创建选项卡时 注入的脚本会创建一个唯一的 ID 并将包含该编号的消息发送到全局页面 并且全局页面会保存该编号 如果全局页面需要发送一些数据到一个tab 即 tab 3 然后全局页

随机推荐

  • 如何使用jquery在加载时滑动整个页面

    我想在更改时将整个页面向下滑动 我想做到这一点的方法是创建一个垂直幻灯片 在单击链接时播放 并在页面加载时再次播放 到目前为止 我只能创建影响特定 DIV 的幻灯片 我还希望它能够垂直滑入 任何想法将不胜感激 只需将所有内容包装在一个 di
  • 为什么应该仅在 1 个元素张量上或使用变量的梯度来调用向后函数?

    我是 pytorch 的新手 我想了解为什么我们不能对包含大小为 2 2 的张量的变量调用后向函数 如果我们确实想在包含大小为 2 2 的张量的变量上调用它 我们必须首先定义一个梯度张量 然后在包含张量 w r t 定义的梯度的变量上调用后
  • C# 如何使用 DataAnnotations StringLength 和 SubString 删除文本

    我有一个模型类 它有一个描述属性 其数据注释属性为 StringLength 长度设置为 100 个字符 当此属性超过 100 个字符并且实体框架尝试保存此属性时 我收到以下错误 StringLength 100 ErrorMessage
  • SQL:条件 AND in where

    我正在尝试创建一个允许省略参数的存储过程 但如果提供了参数则进行 AND 操作 CREATE PROCEDURE MyProcedure LastName Varchar 30 NULL FirstName Varchar 30 NULL
  • Apache Commons CLI - 订购帮助选项?

    我正在使用 Apache Commons CLI 默认情况下 它按字母顺序对命令行上的帮助选项进行排序 那么 出现的就是 csv ip msisdn xml 但我想按如下方式订购它们 csv xml ip msisdn 我知道您可以使用一个
  • 通过 Access 中的 ODBC 链接表更新 SQLite 数据库

    我在使用 SQLite 数据库时遇到问题 我正在使用 SQLite ODBChttp www ch werner de sqliteodbc http www ch werner de sqliteodbc 安装 64 位版本并使用以下设置
  • OpenERP (Odoo) 在哪里找到模块路径?

    我正在使用 Odoo v 8 我想找出 Odoo 在哪里找到模块所在的信息并加载它们 我知道文件 openerp server conf 中有一个变量 addons path 我找到该变量的唯一文件是 opt odoo odoo debia
  • Python:按索引过滤列表

    在Python中我有一个元素列表aList和索引列表myIndices 有什么方法可以一次检索所有这些项目aList将以下值作为索引myIndices Example gt gt gt aList a b c d e f g gt gt g
  • 在 JavaScript 中保存哈希/锚点更改的历史记录

    我目前正在实现一个 JavaScript 库 用于跟踪地址栏中哈希部分的更改历史记录 这个想法是 您可以在哈希部分保留一个状态 然后使用后退按钮返回到之前的状态 在大多数最新的浏览器中 这是自动的 您只需轮询location hash属性进
  • npm run 运行缓慢

    我曾经通过 Makefile 运行各种命令 但对于 Nodejs 项目来说 package json 是更合适的地方 通过 npm 运行命令效果很好 但与命令时间执行相比非常慢 time node modules bin jshint no
  • IIS 7.5 修复尝试加载格式不正确的程序问题?

    我遇到一个异常问题 抛出异常 尝试加载格式不正确的程序 错误 我在同一台 IIS 服务器上有两个相同的网站 我的构建配置适用于其中一个 但不适用于另一个 我的 C MVC 2 Web 应用程序可以部署到驻留在同一 IIS 7 5 Web 服
  • 有没有比 dict() 更快的东西?

    我需要一种更快的方式来存储和访问大约 3GB 的数据k v对 在哪里k是一个字符串或一个整数并且v is an np array 可以有不同的形状 是否有任何对象在存储和访问这样的表时比标准 python 字典更快 例如 一个pandas
  • SceneKit 在立方体测试中的性能

    在学习游戏 3D 图形编程时 我决定从使用 Scene Kit 3D API 开始简单 我的第一个游戏目标是构建一个非常简化的 我的世界 的模仿版 一个只有立方体的游戏 这有多难 下面是我编写的一个循环 用于放置 100 x 100 立方体
  • Fragments 中的“onViewStateRestored”如何工作?

    我真的对 Fragment 的内部状态感到困惑 我有一个活动一次只保存一个片段 并在应该显示另一个片段时替换它 来自文档onSaveInstanceState叫做ONLY如果活动onSaveInstanceState正在被调用 在我的例子中
  • 预加载图像的最佳方式

    预加载图像的最佳方法是什么 我正在尝试创建一个包含大约 59 张 png 图像的图像选项卡 这是我到目前为止的代码
  • 当 SBValue 来自 Swift 字典时,SBData 是错误的

    我正在尝试编写一个Python函数来格式化Foundation Decimal 用作类型摘要器 我把它发布在这个答案 https stackoverflow com a 52749749 77567 我还将它包含在这个答案的底部 并带有额外
  • GCC 使用 typedef 不兼容的指针类型

    我有一些代码在 GCC 4 8 4 下编译得很好 我最近升级了我的系统 现在有了 GCC 5 2 1 并且我收到了有关不兼容指针类型的警告 我已将问题提取到一个重现错误的小示例中 typedef const double ConstSpic
  • 如何计算当前行与下一行?

    在 Spark Sql 1 6 版本中 使用DataFrames 有没有一种方法可以计算特定列的每一行的当前行和下一行的总和 例如 如果我有一个只有一列的表 如下所示 Age 12 23 31 67 我想要以下输出 Sum 35 54 98
  • 如何在不损失质量的情况下放大微小的文本图像?

    文本图像非常小 大小为 17px x 10px MacOS下可以完美放大 let width scale image size width kScale let height scale image size height kScale s
  • 尝试获取数据来创建菜单,getStaticProps 返回未定义

    我正在使用 Next js 13 和 Strapi 我想做一个Menu组件使用getStaticProps 我创建并添加了一个Layout组件中的 app js And a Menu里面的组件Layout 我测试了里面的代码getStati