實作 getStaticProps

我們需要獲取必要的資料來渲染帶有指定 id 的文章。

為此,請再次打開 lib/posts.js 並在底部添加以下 getPostData 函式。它會根據 id 返回文章資料:

export function getPostData(id) {
  const fullPath = path.join(postsDirectory, `${id}.md`);
  const fileContents = fs.readFileSync(fullPath, 'utf8');
 
  // 使用 gray-matter 解析文章的中繼資料部分
  const matterResult = matter(fileContents);
 
  // 將資料與 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>
  );
}

就是這樣!嘗試訪問以下頁面:

您應該可以看到每個頁面的部落格資料:

部落格資料

太好了!我們已成功生成動態路由 (dynamic routes)

遇到問題?

如果您遇到錯誤,請確認您的檔案有以下正確的程式碼:

如果您仍然卡住,歡迎在 GitHub Discussions 上向社群提問。如果您能將程式碼推送到 GitHub 並提供連結,其他人可以查看,這將會很有幫助。

總結

再次說明,以下是我們所做工作的圖形化總結:

如何使用動態路由靜態生成頁面

我們還沒有顯示部落格的 markdown 內容。接下來讓我們來完成這部分。

On this page