我正在使用Next.js开发Django Rest Framework,我被从API获取数据卡住了。我在这个URL http://127.0.0.1:8000/api/campaigns
中有数据,当我访问这个URL时,我看到了数据。
问题是当我用Next.js获取和控制数据时,我得到undefined
。当我尝试Map数据时,我得到错误:
未处理的错误
错误:无法读取未定义的属性(阅读“map”)
下面是我的Index.js
文件,其中完成了数据提取:
import React from 'react'
export default function Index ({data}) {
console.log(data)
return (
<div>
<main>
<h1>Available Campaigns</h1>
{data.map((element) => <div key={element.slug}>
<div>
<div>
<img src={element.logo} height={120} width={100} alt="image" />
</div>
<div></div>
</div>
</div>)}
</main>
</div>
);
}
export async function getStaticProps() {
const response = await fetch("http://127.0.0.1:8000/api/campaigns");
const data = await response.json();
return {
props: {
data: data
},
}
}
字符串
以下是我访问URL时获得的数据的截图:
的数据
以下是前端中Next.js应用的文件结构:
的
另外,请注意,我使用的是最新版本的Next.js。任何帮助都将不胜感激。谢谢。
3条答案
按热度按时间k0pti3hp1#
像
getServerSideProps
和getStaticProps
这样的方法用于在服务器上获取数据,但它们只对pages
文件夹中的页面组件有效(在Next.js中设置路由的初始方式)。从Next.js 13开始,在
app
目录(当您对下图中显示的最后一个问题回答是时使用)中,我们有服务器组件,您可以直接在组件主体中获取数据,如下面的代码片段所示(请阅读评论):的数据
字符串
也就是说,你可以在没有
fetch()
的情况下获取数据,使用任何库,甚至直接使用ORM与数据库对话,在这种情况下,你可以使用Route Segment Config:型
xu3bshqb2#
此StackOverFlow问题(无法在Next.js 13中使用GetStaticProp)已作为此问题的重复问题关闭。
为了帮助像我这样的流浪汉:
你不能在Nextjs 13中使用getStaticProps(使用App Router)。
新的方法是使用fetch。你可以阅读更多关于fetch here的内容。
字符串
这张图片比较了新旧做事方式。image source
的数据
因为新的默认值是缓存所有的获取请求(除非它们选择退出),所以在静态组件中调用fetch与
getStaticProps
具有相同的效果。所以要清楚这个正常的获取请求:
型
与此“强制缓存”请求相同:
型
关于默认缓存的更多信息在这里。
为什么要使用getStaticProps?
为了帮助那些在教程中找到
getStaticProps
并在这里找到方法的用户,你想使用getStaticProps
的原因是你想渲染一个页面,然后将该页面发送给每个用户。这使您的页面更快,向用户发送更少的代码,并且更适合SEO等。
但是如果你需要获取一些数据来渲染页面呢?在Nextjs 13之前,你会使用
getStaticProps
。现在你在一个静态组件中
fetch
。效果是一样的。这种效果是,一旦(在部署项目时的构建时间)Nextjs将获取一些数据,然后使用该数据渲染页面,然后将预渲染的页面发送给需要它的每个人。
如果您需要使用动态路由静态生成一堆页面,则可以使用
generateStaticParams
函数在构建时生成路由,而不是在动态路由的请求时按需生成。对于roadmap,如果你不知道什么是动态路由,就使用
fetch
。jc3wubiy3#
在app目录中,你不能使用
getServerSideProps
,getStaticProps
,getInitialProps
之类的方法来获取数据。而不是与服务器组件一起使用,你可以让组件自定义并直接在组件体中获取数据。此外,你可以将数据传递给客户端组件进行渲染服务。字符串
现在您可以在主组件中调用此函数
型