コース一覧
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分

購入フロー

カートから購入までをつなぐ

第6章でカートを作り、第7章で画面を分けました。残っているのは、カートに入れた商品を買うところです。

fleama の購入は疑似決済です。疑似決済とは、本当のお金を動かさずに「買われた」という事実だけを記録するやり方です。商品の status を "onSale" から "sold" に変えれば、fleama の購入は成立します。

1項目だけ書き換える PATCH

商品を丸ごと送り直すと、商品名や価格を一緒に送り忘れたときに消えてしまいます。変えたいのは status の1項目だけなので、PATCH を使います。

TypeScript

await fetch("/api/items/" + item.id, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ status: "sold" }), });

mock-api.json の PATCH の経路には update が付いています。これは送った項目だけを上書きするという意味です。status だけ送れば、商品名も価格もそのまま残ります。返ってくるのは、上書きしたあとの商品1件です。

返ってきたものを画面に反映する

購入したのに一覧が販売中のままだと、売れたのかどうか分かりません。返ってきた商品で、手元の一覧の同じ id を差し替えます。

TypeScript (JSX)

setItems((prev) => prev.map((item) => bought.find((one) => one.id === item.id) ?? item) );

もう一度 /api/items を取り直しても同じ結果になりますが、通信が1回増えます。返事をそのまま使えるなら、そのほうが速く終わります。

終わったことを伝える

押しても画面が何も変わらないと、買えたのかどうか利用者には分かりません。購入が終わったら、完了したことをはっきり出します。

演習

カートの商品を購入し、売り切れが一覧に反映されるようにします。

ヒント

PATCH は fetch の第2引数に method と headers と body を渡します

await res.json() で返ってくるのは、上書きしたあとの商品1件です

差し替えは prev.map((item) => 見つかった新しい商品 ?? item) の形が書きやすいです

App.tsx
mock-api.json
プレビュー

できているか

  • 一覧に商品が3件出ている
  • カートの合計が 5700 円になっている
  • 購入するを押すと完了が出て、売り切れが反映される
  • PATCH で送っている
  • any で逃げていない
エディタを読み込んでいます