【React】ダークモード対応のReactアプリを作る方法:useContextを使ったテーマ切り替え機能の実装

ウェブアプリケーションでダークモードをサポートすることは、ユーザー体験を向上させる重要な機能の一つです!本記事では、Reactアプリにダークモードを簡単に追加する方法を解説します。useContextを活用して、テーマ切り替え機能を効率的に実装する方法をステップバイステップで紹介します。

・Reactでのダークモードの基本実装方法を学べる。
・useContextを使ってテーマ状態をグローバルに管理する仕組みを理解。
・実践的なコード例で初心者にも分かりやすい解説。

・プロジェクトの準備

Reactアプリをまだ作成していない場合は、以下の手順でセットアップしましょう!

npx create-react-app dark-mode-app
cd dark-mode-app

既存のプロジェクトがある場合は、この手順をスキップしてください。

・useContextを使ったテーマ管理の仕組み

① コンテキストの作成

まず、テーマを管理するコンテキストを作成します。このコンテキストを使うことで、アプリ全体でテーマ情報を共有できます。

ThemeContext.js」として下記を作成します。

import React, { createContext, useState } from 'react';

export const ThemeContext = createContext();

export const ThemeProvider = ({ children }) => {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => {
    setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
  };

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

② テーマに対応したスタイルの定義

テーマごとに異なるスタイルを適用するためのCSSを用意します。

App.css」を下記の通り作成します。

body {
  margin: 0;
  font-family: Arial, sans-serif;
  transition: background-color 0.3s, color 0.3s;
}

.light {
  background-color: #ffffff;
  color: #000000;
}

.dark {
  background-color: #121212;
  color: #ffffff;
}

button {
  padding: 10px 20px;
  margin: 20px;
  font-size: 16px;
  cursor: pointer;
  border: none;
  border-radius: 5px;
}

button.light {
  background-color: #000000;
  color: #ffffff;
}

button.dark {
  background-color: #ffffff;
  color: #000000;
}

・Reactアプリ全体へのテーマ適用

① プロバイダーでアプリをラップする

ThemeProviderを使ってアプリ全体をラップし、テーマ状態をどこからでも参照できるようにします。

App.js」を下記の通り作成します。

import React, { useContext } from 'react';
import { ThemeProvider, ThemeContext } from './ThemeContext';
import './App.css';

const App = () => {
  return (
    <ThemeProvider>
      <ThemedApp />
    </ThemeProvider>
  );
};

const ThemedApp = () => {
  const { theme, toggleTheme } = useContext(ThemeContext);

  return (
    <div className={`App ${theme}`}>
      <h1>React ダークモードアプリ</h1>
      <p>ボタンをクリックしてテーマを切り替えましょう。</p>
      <button className={theme} onClick={toggleTheme}>
        {theme === 'light' ? 'ダークモードに切り替え' : 'ライトモードに切り替え'}
      </button>
    </div>
  );
};

export default App;

・解説:なぜuseContextが便利なのか?

useContextが便利な理由として、主に以下3点があげられます。

① グローバルステート管理がシンプル
useContextを使うと、アプリのどこからでもテーマ状態にアクセス可能。Reduxや外部ライブラリを使わずに軽量な管理ができます。

② コードの再利用性が高い
テーマ切り替えのロジックを1か所で管理できるため、コードの可読性が向上します。

③ パフォーマンスの向上
必要な部分だけが再レンダリングされるため、効率的な更新が可能。

・さらに便利にする改良アイデア

さらに便利にする改良アイディアとして、主に以下3点があげられます。

① テーマの永続化
ユーザーが選んだテーマをlocalStorageに保存し、ページを再読み込みしても設定を維持できます。

useEffect(() => {
  const savedTheme = localStorage.getItem('theme');
  if (savedTheme) {
    setTheme(savedTheme);
  }
}, []);

const toggleTheme = () => {
  const newTheme = theme === 'light' ? 'dark' : 'light';
  setTheme(newTheme);
  localStorage.setItem('theme', newTheme);
};

② アクセシビリティの向上
カラーパレットをWCAGに準拠したものにし、視覚的なアクセシビリティを向上。

③ アニメーションの追加
テーマ切り替え時にCSSアニメーションを適用して、切り替えをスムーズに。

・まとめ

本記事では、ReactのuseContextを活用してダークモードを実装する方法を紹介しました。簡単なコードでアプリにモダンな機能を追加できるだけでなく、拡張性のある設計が可能です。ぜひ、この手法を使ってユーザー体験を向上させたアプリを構築してください!

タイトルとURLをコピーしました