iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Modern Web

Full Stack Web Development 網站實作系列 第 7

Day 7 使用Next.js - 開始 coding 一個非常簡單的 blog (2)

  • 分享至 

  • xImage
  •  

Next 非常適合來架設 blog 網站, blog 網站裡面文章(post) 的網址(URL )是動態(dynamic) 的,例如:標題 "Hello World" 文章的位址(URL) 可以是 /blog/hello-world,標題 "My first post" 文章的位址(URL) 可以是 /blog/my-first-post。

blog 網站裡文章內容是變動的,Next 可以依據變動的網址(dynamic URL),來處理 dynamic的內容。

在 Next 下,我們可以藉由[]建立一個動態(dynamic) 的網頁(page),在再用這個網頁,來建立動態網址(dynamic URL)。

首先,新增一個 pages/blog/[id].js 檔案,這個檔案將會處理 /blog/ 下的所有動態網址。任何動態的內容都會放在檔名的[id]裡,而這個 id 會成為 Next router library 中 query property 的 id 參數(parameter)。

在 pages/blog/[id].js 檔案裡,import router,並建立一個 router object,然後,我們才能透過 router.query.id 取得 [id].js 裡URL的動態部分,動態網址(URL),也可能是這樣 post-[id].js。

import { useRouter } from 'next/router'

const router = useRouter()   // instantiate the router object

pages/blog/[id].js 的內容如下:

import { useRouter } from 'next/router'

export default () => {
  const router = useRouter()
  
  return (
    <>
      <h1>Blog post 華國美學 超越藍綠</h1>
      <p>Post id: {router.query.id} </p>    // 謝謝stevelin666留言 這行原先有錯
      已修正 執行沒問題了
    </>
  )
}

https://ithelp.ithome.com.tw/upload/images/20221023/20129584ilGIzqkrjS.png
打開瀏覽器,到 http://localhost:3000/blog/test 看結果,會看到如下畫面(重點以紅框表示):
https://ithelp.ithome.com.tw/upload/images/20220922/20129584AHLlVZfN01.png
我們可以用 id,去取得一系列文章中的某一篇文章。
以 Json 檔案來說明,把文章放在專案根目錄中的 posts.json 檔案裡。posts.json 內容如下:

{
  "test": {
    "title": "test post",
    "content": "福興穀倉 鐵皮加蓋--彰化縣兩任女縣長執政下的文化局 接力把日本時代建築打造成華國美學建築"
  },
  "second": {
    "title": "福興穀倉 鐵皮加蓋 華國美學",
    "content": "Hey this is the second post content"
  }
}

修改 pages/blog/[id].js,內容如下:

import { useRouter } from 'next/router'
import posts from '../../posts.json'

export default () => {
  const router = useRouter()

  const post = posts[router.query.id]
  if (!post) return <p></p>
  
  return (
    <>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </>
  )
}

會加上 if (!post) return ,是因為提交時(rendering),元件被啟動,但資料還沒被讀進來。
打開瀏覽器,到 http://localhost:3000/blog/test 看結果:
https://ithelp.ithome.com.tw/upload/images/20220922/20129584PxilPv0eJp.png
將網址中的 test 改成 second,看第二篇文章內容:
https://ithelp.ithome.com.tw/upload/images/20220922/20129584SGMXqXgRwM.png
http://localhost:3000/blog 下,列出文章,供讀者點選鏈結。
修改 blog.js 程式:

import Link from "next/link"
import posts from '../posts.json'

const Blog  = () => (
  <div>
    <h2>Blog</h2>
    <h1>Welcome to 福興穀倉 鐵皮加蓋</h1>
    <h1>欣賞彰化縣兩任女縣長綠營翁金珠 藍營王惠美執政下的文化局,</h1>
    <h1> 哪著全國人民納稅錢, 接力把日本時代建築打造成華國美學建築.</h1>

    <ul>
      {Object.entries(posts).map((value, index) => {
        return (
        <li key={index}>
          <Link href='/blog/[id]' as={'/blog/' + value[0]}>
            {value[1].title}
          </Link>
        </li>
        )
      })}
    </ul>
  </div>
)

export default Blog

https://ithelp.ithome.com.tw/upload/images/20220923/20129584hu1ErQwqu9.png


上一篇
Day 6 使用Next.js - 開始 coding 一個非常簡單的 blog (1)
下一篇
Day 8 使用Next.js - 開始 coding 一個非常簡單的 blog (3)-修改程式並加入圖片
系列文
Full Stack Web Development 網站實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
stevelin666
iT邦新手 5 級 ‧ 2022-10-22 16:04:09

請教一下 我做到這個部分的時候 有問題 pages/blog/[id].js 的內容如下:

npm run dev 產生下面問題,是甚麼原因呢?

D:\Nodejs_javascript\Full Stack Web Dev\n02-blog> npm run dev

> n02-blog@1.0.0 dev
> next

ready - started server on 0.0.0.0:3000, url: http://localhost:3000
event - compiled client and server successfully in 450 ms (159 modules)
wait  - compiling /_error (client and server)...
event - compiled client and server successfully in 87 ms (160 modules)
warn  - Fast Refresh had to perform a full reload. Read more: https://nextjs.org/docs/basic-features/fast-refresh#how-it-works
wait  - compiling /blog/[id] (client and server)...
error - ./pages/blog/[id].js
Error:
  x Unexpected token `{`. Expected jsx identifier
   ,----
 9 | <Post id: {router.query.id}</p>
   :           ^
   `----

Caused by:
    0: failed to process input file
    1: Syntax Error

我要留言

立即登入留言