コース一覧
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を作る

Provider が囲む範囲

通り道を作らずに配る

前の回で、テーマを4段のバケツリレーで運びました。途中の ItemList と ItemCard は theme を使わないのに、型にも呼び出しにも theme が並びました。

React には、この受け渡しを飛ばす仕組みがあります。Context です。値を入れておく箱を1つ作り、木のどこからでもその箱を覗けるようにします。

入れ物を作る

createContext で箱を作ります。作るのは1回だけなので、部品の外側、それも専用のファイルに置きます。

TypeScript (JSX)

import { createContext } from "react"; export type Theme = "light" | "dark"; export const ThemeContext = createContext<Theme>("light");

山かっこの <Theme> が「この箱には Theme が入る」という指定です。これを書いておくと、取り出した側でも Theme として扱われます。書かないと、あとで出てくる useContext の戻り値の型が分からなくなります。

丸かっこの "light" は既定値です。箱の外側で覗いた部品、つまりあとで説明する Provider に包まれていない部品が受け取る値になります。値が無いことを表したいときは null を既定値にすることもあります。

配る範囲を決める

箱を作っただけでは、まだ誰にも届きません。どこから下に配るかを書きます。それが Provider です。

TypeScript (JSX)

<ThemeContext.Provider value={theme}> <ItemList items={items} /> </ThemeContext.Provider>

value に入れたものが、この中に描かれる部品すべてに届きます。何段深くても関係ありません。包んだ範囲が配達先だと考えてください。

Provider で包める場所は木の途中でも構いません。fleama では画面全体で同じテーマを使うので、いちばん外側で包みます。

この回はまだ取り出さない

新しく覚えることは1回に1つにします。この回では箱を用意して配る宣言までにして、バケツリレーはそのまま残します。取り出して受け渡しを消すのは次の回です。

演習

ThemeContext を定義して、App の中身を Provider で包みます。

ヒント

export const ThemeContext = createContext<Theme>("light"); の形です

山かっこの型を書かないと、取り出した側で Theme として扱えません

Provider は返す JSX のいちばん外側に置きます

App.tsx
ThemeContext.tsx
プレビュー

できているか

  • カードが3枚並んでいる
  • 価格に dark のクラスが付いたままになっている
  • スニーカーが並んでいる
  • createContext に Theme の型を付けている
  • Provider で包んでいる
  • Provider の value にテーマを渡している
エディタを読み込んでいます