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

ユーザー情報の共有

ユーザー情報の共有

ログイン中の人は誰か

fleama では、ログインしている人の情報をあちこちで使います。ヘッダーの名前、出品ボタンを押せるかどうか、マイページの中身、商品が自分の出品かどうかの判定。どれも同じ「いま誰か」を見ています。

テーマとまったく同じ形なので、Context で配ります。アプリ全体で1つしかなく、多くの部品が見るものは Context の出番です。

まだログイン機能は作らない

本物のログインはサーバーが要ります。第2章のモック API と同じ考え方で、いまは決め打ちのユーザーを1人置きます。あとで本物に差し替えるときに直すのは、この置き場だけで済みます。

TypeScript (JSX)

export type User = { id: string; name: string; };

未ログインを型で表す

テーマと違うところが1つあります。ユーザーは居ないことがあるという点です。ログアウトしていれば誰も居ません。

TypeScript (JSX)

export const UserContext = createContext<User | null>(null);

User | null は「User か、または null」という意味です。第1章で useState<Item | null> を書いたときと同じ形です。

こう書くと、受け取った側で user.name といきなり書けなくなります。null かもしれないからです。TypeScript が止めてくれるので、未ログインの画面を作り忘れられません。

TypeScript (JSX)

const user = useContext(UserContext); if (user === null) { return <p className="greeting">ログインしてください</p>; } return <p className="greeting">{user.name} さん</p>;

早めに return して抜けると、そのあとの行では user が null でないと分かっています。これは TypeScript入門で出てきた絞り込みです。

Context は増やしてよい

テーマとユーザーを1つの箱にまとめたくなりますが、分けたままにします。まとめると、テーマを切り替えただけでユーザーを見ている部品まで描き直されます。変わるきっかけが違うものは、箱を分けるのが基本です。

演習

UserContext を作って、疑似ログイン中のユーザーを画面に配ります。

ヒント

既定値を null にしておくと、Provider の外では未ログイン扱いになります

if (user === null) で先に return すると、そのあとの行では null でないと分かります

user.name をいきなり書くと、null かもしれないと止められます

App.tsx
UserContext.tsx
プレビュー

できているか

  • ログイン中の名前が出ている
  • あいさつの文が出ている
  • 出品ボタンが出ている
  • あいさつが画面の中にある
  • 未ログインを型に入れている
  • useContext でユーザーを取り出している
  • Provider でユーザーを配っている
  • 未ログインの分岐を書いている
エディタを読み込んでいます