paramsを受け取る

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

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

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

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

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

演習

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

ヒント

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

できているか

  • 一覧のリンクが並んでいる
  • /items/2 で革靴の詳細が出る
  • /items/4 では別の商品が出る
  • params を await して使っている