【发布时间】:2020-10-08 14:59:45
【问题描述】:
我正在尝试根据每本书的 “id” 的查询字符串创建动态页面,在单独的页面上显示单个书籍的详细信息(即标题/作者等)。但是,我很难理解如何使用 NextJS 向 API 端点发出请求,该端点将根据其 "id" 获取图书详细信息。我想使用 Material UI 作为 UI 框架。
问题:当我运行 npm run dev 时,图书页面会加载,但图书的“道具”并未传递给 BookAttributes 组件。我在书页中添加的console.log(book) 是undefined,BookAttributes 中的console.log(title) 也是未定义的。
- 我已经在 POSTMAN 中测试了 API 端点,它似乎可以工作。
- 当我使用 Semantic UI-React 而不是 Material UI 重构相同的代码时,书页可以正确加载。
- 我使用 Material UI 网站上的 NextJS Material UI 起始模板作为基线。
我对 NextJS 和 Material UI 还很陌生,因此非常感谢您的帮助和指导。感谢您对此的帮助!
这是我的代码。我尽量保持简洁。
BOOK PAGE(在“pages”目录中)
import axios from 'axios';
import BookAttributes from '../components/Book/BookAttributes';
function Book({ book }) {
console.log(book)
return (
<>
<h1>Book Page</h1>
<BookAttributes {...book} />
</>
)
}
Book.getInitalProps = async ({ query: { _id } }) => {
const url = 'http://localhost:3000/api/book';
const payload = { params: { _id }}
const response = await axios.get(url, payload)
return { book: response.data }
}
export default Book;
BOOK API ENDPOINT(在“pages/api”目录中)
import Book from '../../models/Book';
import connectDb from '../../utils/connectDb';
connectDb()
export default async (req, res) => {
const { _id } = req.query
const book = await Book.findOne({ _id })
res.status(200).json(book);
}
BOOK ATTRIBUTE COMPONENT(在“组件”目录中)
import React from 'react';
function BookAttributes({ title }) {
console.log(title)
return (
<>
<h1>{title}</h1>
</>
)
}
export default BookAttributes;
【问题讨论】:
-
你用的是哪个版本的nextjs?如果您使用的是 next 9.3 或更高版本,我建议使用
getServerSideProps或getStaticProps来获取数据,而不是getInitialProps。 -
感谢您的帮助。是的,我正在运行 NextJS 9.3。由于我对 NextJS 很陌生,您能否提供一个示例,说明如何在上面的代码中使用“getServerSideProps”和“getStaticProps”?我尝试使用 NextJS 网站上的示例,但无法使其正常工作。非常感谢。
-
您是在
http://localhost:3000/book?id=something还是http://localhost:3000/book?_id=something上进行测试? -
@GregoryWiley 是的,但首先您需要了解
dynamic routing的工作原理以及何时使用getStaticProps或getServerSideProps。这就是为什么我建议您阅读 nextjs docs 中的基础知识并查看 dynamic routes 部分。 -
@subashMahapatra 好点。我同意。我现在正在学习 NextJS 教程,并将专注于动态路由部分。如果您有任何其他代码示例,请告诉我。谢谢。
标签: reactjs material-ui next.js