コース一覧
React Routerとアプリ設計
URLパラメータ

React Routerとアプリ設計

React Router、Routes・Route・Link、URLパラメータ、検索条件、404、見た目と機能の分離、合成、機能別フォルダを扱う全18レッスンのアプリ設計コースです。fleamaを商品一覧・詳細・出品・カート・マイページを持つ複数ページSPAとして完成させます。

1
ルーティング(React Router v7)
01. ルーティング導入15分
02. RoutesとRoute15分
03. 遷移を作る15分
04. URLパラメータ15分
05. 検索条件をURLに15分
06. 404ページ15分
07. つくる - ページ分割完了20分
08. 第7章クイズ15分
2
コンポーネント設計パターン
01. 見た目と機能の分離15分
02. 合成で組み立てる15分
03. 機能別フォルダ10分
04. つくる - 設計リファクタ20分
05. 第8章クイズ15分
3
総合制作
01. 購入フロー20分
02. マイページ20分
03. 仕上げ15分
04. 自由拡張20分
05. 完成と次のステップ10分

URLパラメータ

URL の中の id を読む

商品の数だけ Route は書けない

商品詳細のページは、商品の数だけ URL があります。

プレーンテキスト

/items/1 /items/2 /items/3

出品されるたびに Route を1行足す、というわけにはいきません。変わるところを変数にした1本の Routeで受けます。

TypeScript (JSX)

<Route path="/items/:id" element={<ItemDetail />} />

:id の : から始まる部分が変数です。これを URL パラメータと呼びます。この1行で /items/1 も /items/999 も受けられます。名前は :id でなくても構いませんが、受け取るときに同じ名前を使います。

useParams で受け取る

受け取る側では useParams を呼びます。

TypeScript (JSX)

import { useParams } from "react-router"; function ItemDetail() { const { id } = useParams(); const item = items.find((i) => i.id === id); }

返ってくるのは { id: "2" } のようなオブジェクトです。分割代入で id を取り出せます。

ここで気を付けることが1つあります。URL から来る値は必ず文字列です。/items/2 の 2 は数値の 2 ではなく文字の "2" です。Item の id を number で持っていると find が永遠に見つけられません。fleama の id を最初から string にしてあるのはこのためです。

見つからなかったときを書く

URL は誰でも打ち込めます。/items/999 のように、無い商品を指されることは普通に起きます。

TypeScript (JSX)

if (!item) { return <p className="detail-missing">その商品は見つかりませんでした</p>; }

find は見つからないと undefined を返すので、TypeScript も「無いかもしれない」と教えてくれます。ここを書かずに item.title と書くと、その場で怒られます。型が、書き忘れを先に見つけてくれる場面です。

演習

商品詳細のページを1本の Route で作ります。

ヒント

const { id } = useParams(); で受け取ります。名前は Route に書いた :id と揃えます

探すのは items.find((i) => i.id === id) です。URL から来る id は文字列です

見つからなかったときは、下まで進まずに先に return してしまうのが読みやすいです

App.tsx
プレビュー

できているか

  • 一覧に商品のリンクが並んでいる
  • 2件目の革靴を押すと、革靴の詳細が出る
  • useParams で受け取っている
  • URL パラメータ付きの Route を書いている
エディタを読み込んでいます