React Hooksは、React 16.8で導入された機能で、状態管理やライフサイクルメソッドなどをクラスコンポーネントなしで実現することができます。その中でも、useContextは複数のコンポーネント間で状態を共有するために便利なHooksの一つです。

しかし、useContextの使い方については、実践的な例が少なく、初めて使う場合は戸惑うこともあるかもしれません。そこで本記事では、React Hooksを使ったuseContextの実践的な使い方について紹介します。

useContextとは

useContextは、React Hooksの一つで、コンポーネント間で共有するための状態を管理するために使われます。Contextを使うことで、状態をPropsで渡す必要がなくなり、簡潔なコードでコンポーネント間の状態共有が可能になります。

useContextを使った実践的な例

useContextを使った実践的な例として、カウンターアプリケーションを考えてみましょう。以下のような構成で、複数のコンポーネントでカウンターの値を共有します。

- App
  - Counter
  - Display

まず、Counterコンポーネントでカウンターの状態を管理するために、useStateを使います。

import React, { useState } from "react";

const Counter = () => {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <button onClick={handleClick}>カウントアップ</button>
      <p>現在のカウント: {count}</p>
    </div>
  );
};

export default Counter;

次に、Displayコンポーネントでカウンターの値を表示するために、useContextを使います。

import React, { useContext } from "react";
import { CountContext } from "./App";

const Display = () => {
  const count = useContext(CountContext);

  return <p>現在のカウント: {count}</p>;
};

export default Display;

ここで、CountContextは、Appコンポーネントで定義します。

import React, { createContext, useState } from "react";
import Counter from "./Counter";
import Display from "./Display";

export const CountContext = createContext();

const App = () => {
  const [count, setCount] = useState(0
);

  return (
    <div>
      <CountContext.Provider value={count}>
        <Counter />
        <Display />
      </CountContext.Provider>
    </div>
  );
};

export default App;

ここで、CountContext.Providerで囲まれた部分が、Contextの範囲を定義しています。CountContext.Providerにvalue={count}を指定することで、CountContext内のすべてのコンポーネントで、countの値を使用することができます。

これで、Counterコンポーネントでカウンターの値を増やし、Displayコンポーネントで現在の値を表示することができるようになりました。

まとめ

本記事では、React Hooksの一つであるuseContextを使った実践的な例について紹介しました。useContextを使うことで、複数のコンポーネント間で状態を共有することができます。具体的には、カウンターアプリケーションを例に挙げ、useStateとuseContextを組み合わせて、コンポーネント間の状態共有を実現しました。

今後も、React Hooksを使った実践的な例について、継続的に取り上げていきたいと思います。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です