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

使い分け

useState と useReducer の分かれ目

どちらを使うか

useReducer を覚えると、何でも reducer にしたくなります。ですが検索欄の文字まで reducer にすると、書く量が増えるだけで読みやすくはなりません。使い分けの目安を持っておきます。

useState のままでよいもの

次のどれかに当てはまるなら useState です。

  • 値が1つで、更新が「新しい値に置き換える」だけ
  • 更新する場所が1か所しかない
  • 前の値を見なくても次の値が決まる

fleama で言えば、検索欄の文字、ダークモードの入り切り、モーダルの開閉です。setKeyword(e.target.value) の1行で終わる話に、action の型を足す理由はありません。

useReducer に寄せるもの

次のどれかに当てはまったら reducer を考えます。

  • 1つの操作で、複数の値が一緒に変わる
  • 次の値が、前の値の中身に依っている
  • 同じ状態を、いくつもの場所から違うやり方で更新する
  • 更新の決まりごとに、条件分岐が混じっている

カートがまさにこれです。「入れる」は、既に入っていれば数量を増やし、無ければ行を足す。前の中身を見ないと次が決まりません。更新の規則が育っていく状態は reducer 向きと覚えてください。

判断の一言

useState と useReducer のどちらが正しいか、という問いにはあまり意味がありません。どちらでも動きます。効くのは次の一言です。

この状態の更新の決まりごとを、他の人に説明する必要があるか。

説明が要るなら、それは reducer に書き出せる決まりごとです。説明が要らないなら useState のままで十分です。

混ぜてよい

1つの部品の中で両方を使って構いません。カートは reducer、検索欄は useState、という形が普通です。全部を1つの巨大な reducer にまとめると、関係の無い値まで同じ action で触ることになり、かえって読みにくくなります。

演習

カートだけを reducer に移し、検索欄は useState のまま残します。

ヒント

handleAdd の中身は、そのまま ADD の case に引っ越せます

reducer は部品の外に書きます。中に書くと描き直すたびに作り直しになります

検索欄まで reducer にする必要はありません。1行で終わる更新は useState のままです

App.tsx
プレビュー

できているか

  • スニーカーを入れると合計が 4800 円になる
  • 革靴 で絞り込むと 1 件になる
  • 絞り込んだ革靴も入れられて合計が 14600 円になる
  • 削除でスニーカーの行だけが消える
  • カートを useReducer で持っている
  • カートの更新を setCart で書いていない
  • 検索欄は useState のまま残している
  • any で逃げていない
エディタを読み込んでいます