コース一覧
React状態管理:カスタムフック・Context・Reducer
なぜカスタムフックか

React状態管理:カスタムフック・Context・Reducer

カスタムフック、フックのルール、Context、useContext、useReducer、Actionのunion型を扱う全21レッスンの状態管理コースです。fleamaの商品・フォーム・テーマ・ユーザー・カート状態を、再利用可能なロジックと予測可能な状態遷移へ整理します。

1
カスタムフック
01. なぜカスタムフックか10分
02. useItemsを作る15分
03. useFormを作る15分
04. フックのルール15分
05. フックに型を付ける15分
06. つくる - フック化完了20分
07. 第4章クイズ15分
2
useContext
01. バケツリレーの限界15分
02. Contextを作る15分
03. useContextで使う15分
04. テーマの全体共有15分
05. ユーザー情報の共有15分
06. つくる - Context整備20分
07. 第5章クイズ15分
3
useReducer
01. setStateの散らかり15分
02. useReducer15分
03. Actionのunion型15分
04. カートreducer15分
05. 使い分け10分
06. つくる - カート完成20分
07. 第6章クイズ15分

なぜカスタムフックか

同じ 12 行が 2 つ

一覧が2つになった日

第3章までで、商品一覧を API から取ってきて、読み込み中の表示とエラーの表示まで面倒を見られるようになりました。ここで fleama に「トップスの一覧」が増えます。やることはくつの一覧とまったく同じなので、書いたコードをもう1つの画面へ写します。

TypeScript (JSX)

const [items, setItems] = useState<Item[]>([]); const [loading, setLoading] = useState(true); useEffect(() => { fetch("/api/items?category=shoes") .then((res) => res.json()) .then((data: Item[]) => { setItems(data); setLoading(false); }); }, []);

写した先で変わるのは category=shoes の1か所だけです。残りはそっくり同じものが2つ並びます。

重複が高くつくのは、直すとき

写すのは一瞬です。高くつくのはそのあとに来ます。

  • 失敗したときの再試行を足したい。2か所とも直す
  • 取得中に別のカテゴリへ切り替えたときの競合を潰したい。2か所とも直す
  • 片方だけ直して、もう片方を忘れる。画面によって挙動が違うという、いちばん見つけにくい不具合になる

同じロジックが n 個あると、直す手間が n 倍になり、直し忘れる確率も n 倍になります。 商品の一覧、カートの中身、購入履歴と画面が増えるほど、この n は増えていきます。

コンポーネントでは切り出せない

React入門では「同じ見た目が2か所にあるならコンポーネントにする」と習いました。しかし今回そっくりなのは見た目ではありません。state と useEffect の組み合わせ、つまりロジックのほうです。見た目は一覧とカードで別々にしたいこともあります。

見た目を持たず、ロジックだけを持ち出す入れ物。それがカスタムフックです。次のレッスンで実際に作ります。この回ではまず重複を自分の手で作って、何が二重になるのかを目で確かめておきます。

演習

トップスの一覧を、くつの一覧とまったく同じ書き方で足します。

ヒント

ShoesList をそのまま写して、category のところと ul のクラス名だけを変えます

fetch の返事は res.json() でデータにしてから setItems に渡します

写し終わったら、2つの関数を見比べて何行が同じかを数えてみてください

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

できているか

  • くつの一覧が2件出ている
  • トップスの一覧が出ている
  • トップスに T シャツが並んでいる
  • tops を取りに行っている
エディタを読み込んでいます