コース一覧
Next.jsフルスタック:サーバー・データ取得・API
paramsを受け取る

Next.jsフルスタック:サーバー・データ取得・API

Server ComponentsとClient Components、use client、サーバーfetch、asyncコンポーネント、動的ルート、params、notFound、キャッシュ、Route Handler、GET・POST API、Server Actions、フォームを扱う全24レッスンのフルスタックコースです。fleamaの商品取得と出品機能をNext.js内へ実装します。

1
Server / Client Components
01. サーバーで動く部品10分
02. Server Components15分
03. use clientの宣言15分
04. どちらに置くか15分
05. 境界をまたぐ合成15分
06. 境界の設計15分
07. つくる - 部品の仕分け20分
08. 第4章クイズ15分
2
データ取得と動的ルート
01. サーバーでfetch15分
02. asyncコンポーネント15分
03. 動的ルート15分
04. paramsを受け取る15分
05. notFoundで404にする15分
06. キャッシュのきほん10分
07. 検索をサーバーで15分
08. つくる - サーバー取得化20分
09. 第5章クイズ15分
3
API Routesとフォーム
01. Route Handler15分
02. GET APIを作る15分
03. POST APIを作る15分
04. Server Actionsの触り15分
05. フォーム実装15分
06. つくる - 受け口の完成20分
07. 第6章クイズ15分

paramsを受け取る

params から id を取り出す

角かっこの中身を受け取る

前回作った app/items/[id]/page.tsx は、どの商品を押しても同じ中身でした。[id] の場所に入った値を使っていないからです。

ページの関数は params という props を受け取ります。ここに、角かっこで付けた名前をキーにした値が入っています。

TypeScript (JSX)

type Props = { params: Promise<{ id: string }>; }; export default async function ItemDetailPage({ params }: Props) { const { id } = await params; const res = await fetch(`/api/items/${id}`); const item = await res.json(); return <h1>{item.title}</h1>; }

なぜ await が要るのか

params は Promise です。Next.js 15 から、値そのものではなく「あとで決まるもの」として渡されるようになりました。使うときは await params と書いて中身を開けます。

型も Promise<{ id: string }> と書きます。少し回りくどく見えますが、await を書き忘れたときに型のほうが先に教えてくれるので、書いておく価値があります。

値はいつも文字列

/items/2 の 2 は数値ではなく文字列の "2" です。URL は文字の並びなので当然といえば当然ですが、数として計算に使うときは Number(id) で直します。

今日は取得したい商品の id をそのまま URL に混ぜるだけなので、文字列のまま使えます。

演習

params から id を取り出し、その商品を取得して表示します。

ヒント

props の型は { params: Promise<{ id: string }> } です

const { id } = await params; と書くと id だけ取り出せます

URL はテンプレート文字列で組み立てます

app/items/[id]/page.tsx
layout.tsx
app/page.tsx
mock-api.json
プレビュー

できているか

  • 一覧のリンクが並んでいる
  • /items/2 で革靴の詳細が出る
  • /items/4 では別の商品が出る
  • params を await して使っている
エディタを読み込んでいます