コース一覧
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 に置く

検索した画面を人に見せられない

第1章で作った検索欄は、打った言葉を useState に持っていました。動きはしますが、絞り込んだ結果を人に送れません。URL がずっと /items のままだからです。読み込み直せば条件も消えます。

商品を探す条件は、その人がいま見ている画面そのものです。画面を表すものは URL に置くと考えると、置き場所は useState ではなく URL になります。

クエリ文字列

URL の ? から後ろをクエリ文字列と呼びます。

プレーンテキスト

/items?q=革 /items?q=革&category=shoes

& でいくつでも並べられます。この形なら、そのまま貼って渡せば相手も同じ絞り込みを見られます。ブラウザの履歴にも残るので、戻るボタンで1つ前の条件に戻れます。

useSearchParams

読み書きは useSearchParams でやります。useState によく似た形です。

TypeScript (JSX)

import { useSearchParams } from "react-router"; const [searchParams, setSearchParams] = useSearchParams(); const keyword = searchParams.get("q") ?? "";

get は無いときに null を返すので、?? "" で空文字にしておきます。これで keyword は必ず string になり、そのまま value に渡せます。

書き込みは setSearchParams です。

TypeScript (JSX)

<input className="search" value={keyword} onChange={(e) => setSearchParams({ q: e.target.value })} />

打つたびに URL が書き換わり、その変化で部品が描き直されます。state は1つも持っていません。URL が唯一の置き場所になっている、というのがこの回の要点です。プレビューでは、打つたびに画面の上の帯が変わるのが見えます。

何を URL に置くか

何でも URL に入れればよいわけではありません。目安は「人に送ったときに同じ画面が見えてほしいか」です。検索語や並び順や表示中のページ番号は入れます。入力途中のフォームや、開いているかどうかだけのメニューは入れません。

演習

商品一覧の検索欄を、URL と同期させます。

ヒント

const [searchParams, setSearchParams] = useSearchParams(); の形で受け取ります

searchParams.get("q") は無いとき null なので、?? "" を付けて空文字にします

絞り込みは items.filter((item) => item.title.includes(keyword)) です。空文字なら全部残ります

App.tsx
プレビュー

できているか

  • 一覧に検索欄と3件の商品が出ている
  • 革 と打つと革靴だけに絞り込まれる
  • useSearchParams を使っている
  • 検索語を URL に書き込んでいる
エディタを読み込んでいます