コース一覧
React状態管理:カスタムフック・Context・Reducer
つくる - Context整備

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分

つくる - Context整備

第5章のまとめとして作る

新しいことは出てきません。ここまでの4つを組み合わせて、fleama の共有状態を整えます。

  • バケツリレーの限界 — 通り道になる部品を作らない
  • createContext と Provider — 配る箱と配る範囲
  • useContext — 使う人が直接取りに行く
  • Provider 設計 — state と関数を持つ部品にまとめる

2つの Provider を重ねる

テーマとユーザーは別の箱なので、Provider も2つになります。重ねて書きます。

TypeScript (JSX)

export default function App() { return ( <ThemeProvider> <UserProvider> <Screen /> </UserProvider> </ThemeProvider> ); }

内側の UserProvider は ThemeProvider の中にいるので、UserProvider 自身もテーマを覗けます。外側と内側の順番に迷ったら、依存する側を内側に置くと覚えてください。今回はどちらも相手を見ないので、順番はどちらでも動きます。

段が深くなるのを嫌って1つの箱にまとめたくなりますが、分けたままにします。テーマを切り替えただけでユーザーを見ている部品まで描き直されるのを避けるためです。

置き場所を決める

ここまでで、値の置き場所が3種類そろいました。

  • その部品の中だけで使う値は useState
  • 親子ひと組の間で渡す値は props
  • アプリのあちこちで同じものを見る値は Context

迷ったら props から始めて、2段以上のバケツリレーになったときに Context を考える。この順で足りなくなってから移すほうが、最初から Context に入れるより整理された形になります。

演習

テーマとユーザーの2つの Context をそろえて、fleama の土台を完成させます。

ヒント

UserProvider の中身は ThemeProvider とほぼ同じ形です。state が要らないぶん短くなります

Provider を重ねるときは、返す JSX を入れ子にするだけです

UserName は Screen の中にいるので、両方の Context を覗けます

App.tsx
ThemeContext.tsx
UserContext.tsx
プレビュー

できているか

  • 最初はライトテーマになっている
  • ログイン中の名前が出ている
  • 商品カードが3枚並んでいる
  • 名前がヘッダーの中にある
  • テーマを切り替えても名前は残る
  • UserProvider を切り出している
  • UserProvider が Provider で包んでいる
  • App が2つの Provider を重ねている
  • useContext でユーザーを取り出している
エディタを読み込んでいます