コース一覧
React Routerとアプリ設計
ルーティング導入

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分

ルーティング導入

a タグと Link の違い

1つの画面に全部を詰めてきた

ここまでの fleama は、商品一覧もカートも同じ画面の中で切り替えていました。動きはしますが、困ることが3つあります。

  • 気に入った商品を人に教えられない。どこを見ていても URL が同じだから
  • ブラウザの戻るボタンを押すと、アプリごと閉じてしまう
  • 開き直すと必ず最初の画面に戻る

画面と URL が結び付いていないのが原因です。これを結び付けるしくみをルーティングと呼びます。

ページ移動を自分でやる

素の HTML なら、別のページへは次のように移ります。

HTML

<a href="/items">商品一覧</a>

これを押すと、ブラウザがサーバーに次のページをもらいに行き、画面が真っ白になってから作り直されます。React で作ったアプリはこれをやりません。持っている state も全部捨てることになるからです。

そのかわり、URL の変化を見て、出す部品を差し替えるという形にします。サーバーには一度も行きません。この作りを SPA と呼びます。Single Page Application の略で、ページは1枚のまま中身だけ入れ替わる、という意味です。

React Router を入れる

自前で書くと大変なので、React Router という定番のライブラリを使います。このコースでは v7 を、宣言的モードと呼ばれる書き方で使います。

一番外側を BrowserRouter で包み、その中に Routes と Route で対応表を書きます。

TypeScript (JSX)

import { BrowserRouter, Routes, Route } from "react-router"; export default function App() { return ( <BrowserRouter> <Routes> <Route path="/" element={<Home />} /> </Routes> </BrowserRouter> ); }

path がその URL、element がそのとき出す部品です。/ を開いたら Home を出す、という1行だけの対応表から始めます。

読み込み元は react-router です。以前は react-router-dom と書いていましたが、v7 からはこちらに寄せられています。

いま居る場所を見る

この教材のプレビューにはアドレス欄がありません。かわりに、画面の上に細い帯が出て、そこにいま居る URL が表示されます。これから先の章では、リンクを押したときにこの帯がどう変わるかを見ながら進めてください。

演習

いまの fleama を BrowserRouter で包み、/ に一覧を割り当てます。

ヒント

import { BrowserRouter, Routes, Route } from "react-router"; の形で読み込みます

Routes は Route を入れる箱です。Route を直接 BrowserRouter の下に置くと動きません

element に渡すのは <Home /> のように書いた JSX です。Home とだけ書くと出ません

App.tsx
プレビュー

できているか

  • トップの画面が出ている
  • 商品が3件並んでいる
  • スニーカーが出ている
  • react-router から読み込んでいる
  • BrowserRouter で包んでいる
  • パス / の Route を書いている
エディタを読み込んでいます