テーマ状態のためのReact Context
コンポーネントツリー全体に現在のテーマと切り替え関数を公開するThemeProviderを構築します
「テーマ状態のためのReact Context」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
ThemeContextの作成
まず、コンテキストの形に合ったデフォルト値を指定してcreateContext()を呼び出します: const ThemeContext = createContext({ theme: 'light', toggleTheme: () => {} })。デフォルト値が使われるのは、コンポーネントが親のProviderなしでコンテキストを読み取る場合だけです。これにより、コンポーネントを分離してテストしやすくなります。
ThemeProviderコンポーネント
ThemeProviderコンポーネントは、テーマに関するすべてのロジックを保持するラッパーです。マウント時にシステム設定を読み取り、themeの状態を管理し、toggleTheme関数を提供して、子要素をThemeContext.Provider value={{ theme, toggleTheme }}でラップします。コンポーネントツリーの上位に配置してください。
useContextによるコンテキストの利用
子孫コンポーネントであれば、useContext(ThemeContext)を呼び出してテーマにアクセスできます。これにより、themeとtoggleThemeを含む現在のコンテキスト値が返されます。テーマが変わるとコンポーネントは自動的に再レンダリングされるため、propsを何階層も渡さなくても常に最新の状態と同期されます。
data-themeとDOMの同期
CSS変数は、ルート要素に設定されたdata-theme属性に依存します。ThemeProviderに、themeが変わるたびに実行されるuseEffectを追加します: document.documentElement.setAttribute('data-theme', theme)。これにより、Reactの状態とCSSレイヤーをシームレスに連携できます。
ユーザー設定のlocalStorageへの保存
ページを再読み込みしてもユーザーの選択を保持するには、テーマが変わるたびにlocalStorageへ書き込みます: localStorage.setItem('theme', theme)。このロジックをuseLocalStorageカスタムフックにまとめれば、stateのようなペアを返し、更新のたびに自動的に保存できます。
localStorageからのテーマの初期化
テーマの状態を初期化する際は、まずlocalStorageから読み取ります: localStorage.getItem('theme')。保存された値がない場合は、window.matchMedia('(prefers-color-scheme: dark)').matchesを使ってシステム設定にフォールバックします。この初期化はマウント時に一度だけ実行されます。
テーマの優先順位
優先順位は、高い順にlocalStorageに保存されたユーザー設定、システムOSの設定、ハードコードされたデフォルト値(通常はライトテーマ)です。この順序により、ユーザーが最終的な決定権を持ちながら、アプリで明示的に選択していない場合はOSの設定も尊重できます。
useTheme便利フック
すべてのコンポーネントで直接useContext(ThemeContext)を呼び出すと、実装の詳細が外部に露出します。代わりにuseThemeフックをエクスポートします: function useTheme() { return useContext(ThemeContext); }。これでコンポーネントはuseThemeをインポートして呼び出すだけで、内部のコンテキストを意識せずに済みます。
切り替え関数の提供
toggleTheme関数はlightとdarkを切り替えます: setTheme(prev => prev === 'light' ? 'dark' : 'light')。コンテキストを通じてこの関数を公開すれば、ツリー内のどの場所にあるボタンからでも実行できます。状態は一か所で管理し、切り替えロジックを全体で共有できます。
コンテキスト値のメモ化
コンテキスト値のオブジェクトは、ThemeProviderがレンダリングされるたびに再作成されます。useMemoでラップすると、すべてのコンテキスト利用側で発生する不要な再レンダリングを防げます: const value = useMemo(() => ({ theme, toggleTheme }), [theme])。これはコンテキストプロバイダーでよく使われるパフォーマンス最適化です。
ThemeProviderのテスト
テストでは、ThemeProviderをラッパーとして使うカスタムrenderWithThemeユーティリティでレンダリングをラップします。分離したテスト用に、簡易的なモックコンテキストを作成することもできます: ThemeContext.Provider value={{ theme: 'dark', toggleTheme: jest.fn() }}。これにより、特定のテーマ状態でコンポーネントをテストできます。
テーマの優先順位
アプリのテーマを初期化する際、優先順位が最も高いものから低いものへ並ぶ正しい順序はどれですか?
レッスンのまとめ: テーマ状態のReact Context
ThemeContextと、テーマの状態を管理してlocalStorageと同期し、ドキュメントにdata-themeを設定するThemeProviderを作成します。利用側ではuseTheme便利フックを使うと、すっきり記述できます。優先順位は、保存された設定、システム設定、デフォルト値の順です。
よくある質問
「テーマ状態のためのReact Context」レッスンは無料ですか?
はい。「テーマ状態のためのReact Context」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「テーマ状態のためのReact Context」で何を学びますか?
コンポーネントツリー全体に現在のテーマと切り替え関数を公開するThemeProviderを構築します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「テーマ状態のためのReact Context」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- システムのカラースキームの検出
- テーマ切り替えのためのCSS変数
- テーマ状態のためのReact Context
- テーマの永続化とフラッシュの防止