如何使用getInitialProps将数据馈送到Next.js组件
当我谈论向Next.js添加动态内容我们动态生成帖子页面时遇到问题,因为该组件需要预先提供一些数据,并且当我们尝试从JSON文件中获取数据时:
import { useRouter } from 'next/router'
import posts from '../../posts.json'
export default () => {
const router = useRouter()
const post = posts[router.query.id]
return (
<>
<h1>{post.title}</h1>
<p>{post.content}</p>
</>
)
}
我们得到了这个错误:
我们该如何解决呢?以及如何使SSR适用于动态路线?
我们必须使用称为的特殊功能为组件提供道具getInitialProps()
附加到组件上。
为此,首先我们将组件命名为:
const Post = () => {
//...
}
export default Post
然后我们将功能添加到它:
const Post = () => {
//...
}
Post.getInitialProps = () => {
//…
}
export default Post
该函数将一个对象作为其参数,其中包含多个属性。特别是,我们现在感兴趣的是,我们得到了query
对象,我们之前用来获取帖子ID的对象。
因此,我们可以使用对象解构句法:
Post.getInitialProps = ({ query }) => {
//...
}
现在我们可以从该函数返回帖子:
Post.getInitialProps = ({ query }) => {
return {
post: posts[query.id]
}
}
我们也可以删除导入useRouter
,我们从props
财产传递给Post
成分:
import posts from '../../posts.json'
const Post = props => {
return (
<div>
<h1>{props.post.title}</h1>
<p>{props.post.content}</p>
</div>
)
}
Post.getInitialProps = ({ query }) => {
return {
post: posts[query.id]
}
}
export default Post
现在将没有错误,并且SSR将按预期运行,如您所见,查看视图源:
这getInitialProps
当我们使用Link
组件,就像我们所做的那样。
重要的是要注意getInitialProps
在接收到的上下文对象中,除了query
反对这些其他属性:
pathname
: 这path
URL部分asPath
-实际路径(包括查询)的字符串显示在浏览器中
在打电话的情况下http://localhost:3000/blog/test
将分别导致:
/blog/[id]
/blog/test
对于服务器端渲染,它还将收到:
req
:HTTP请求对象res
:HTTP响应对象err
:错误对象
req
和res
如果您已完成任何Node.js编码,您将很熟悉。
免费下载我的Next.js手册
接下来的更多教程:
- Next.js入门
- Next.js vs Gatsby vs create-react-app
- 如何安装Next.js
- 使用链接在Next.js中链接两个页面
- 路由器中Next.js中的动态内容
- 使用getInitialProps将数据馈送到Next.js组件
- 使用CSS样式化Next.js组件
- 在Next.js中预取内容
- 使用路由器检测Next.js中的活动链接
- 查看源代码以确认SSR在Next.js中正常工作
- Next.js:使用自定义标签填充head标签
- 立即部署Next.js应用程序
- Next.js:仅在Next.js的服务器端或客户端运行代码
- 在生产中部署Next.js应用
- 如何分析Next.js应用程序捆绑包
- Next.js中的延迟加载模块
- 向您的Next.js应用添加包装器组件
- Next.js添加到您的应用程序中的图标
- Next.js应用程序捆绑包
- 如何使用Next.js路由器
- 如何使用Next.js API路由
- 如何在Next.js应用中在服务器端获取Cookie
- 如何更改Next.js应用程序端口