跳到内容

32

实现 getStaticProps

我们需要获取必要的数据,以渲染给定 id 的帖子。

为此,再次打开 lib/posts.js 并在底部添加以下 getPostData 函数。它将根据 id 返回帖子数据

export function getPostData(id) {
  const fullPath = path.join(postsDirectory, `${id}.md`);
  const fileContents = fs.readFileSync(fullPath, 'utf8');
 
  // Use gray-matter to parse the post metadata section
  const matterResult = matter(fileContents);
 
  // Combine the data with the id
  return {
    id,
    ...matterResult.data,
  };
}

然后,打开 pages/posts/[id].js 并替换此行

import { getAllPostIds } from '../../lib/posts';

为以下代码

import { getAllPostIds, getPostData } from '../../lib/posts';
 
export async function getStaticProps({ params }) {
  const postData = getPostData(params.id);
  return {
    props: {
      postData,
    },
  };
}

帖子页面现在使用 getStaticProps 中的 getPostData 函数来获取帖子数据并将其作为 props 返回。

现在,让我们更新 Post 组件以使用 postData。在 pages/posts/[id].js 中,用以下代码替换导出的 Post 组件

export default function Post({ postData }) {
  return (
    <Layout>
      {postData.title}
      <br />
      {postData.id}
      <br />
      {postData.date}
    </Layout>
  );
}

就是这样!尝试访问这些页面

您应该能够看到每个页面的博客数据

Blog Data

太棒了!我们已成功生成 动态路由

出错了?

如果您遇到错误,请确保您的文件代码正确

如果您仍然遇到困难,请随时在 GitHub Discussions 上向社区提问。如果您能将代码推送到 GitHub 并链接过去,以便其他人查看,那将非常有帮助。

总结

再次,这是我们所做工作的图形总结

How to Statically Generate Pages with Dynamic Routes

我们还没有显示博客的 markdown 内容。接下来让我们来做这个。

您已完成本章32

下一章

33:渲染 Markdown

Pages Router: 实现 getStaticProps | Next.js 框架