React Hooks早わかり(useContext編)

投稿日 : 2022-04-04

更新日 : 2022-04-04

useContext 概要

何らかのデータが、ネストレベルの異なる多くのコンポーネントからアクセスできる必要がある時に使用される。
公式リファレンス
https://ja.reactjs.org/docs/hooks-reference.html#usecontext
わかりやすかった記事
https://reffect.co.jp/react/react-usecontext-understanding


useContext を利用する利点

  • 複数コンポーネントで同じステートを簡単に共有できる。
  • ステート、イベントハンドラを一元管理できる。
  • 全てのコンポーネントを明示的に通すことなしに、コンポーネントツリーの深くまで値を渡せる。
  • アプリケーション内の多くのコンポーネントから必要とされる特定のタイプのプロパティ
    • (例: ロケール設定、UI テーマなど)で使用するのがオススメ


import { VFC, createContext, useContext, useState } from "react";

// Contextを作成する。
export const UserCountContext = createContext(
    {} as {
        count: number;
        setCount: React.Dispatch<React.SetStateAction<number>>;
    }
);

// UseContextSampleのStateを子のコンポーネントに渡す
export const UseContextSample: VFC = () => {
    const [count, setCount] = useState(100);
    const value = {
        count,
        setCount,
    };

     return (
        <div style={{ textAlign: "center" }}>
            <h1>useContext sample</h1>
            {/* 値を渡したいコンポーネントをcontext.Providerで囲む */}
            <UserCountContext.Provider value={value}>
                <ComponentA />
            </UserCountContext.Provider>
            <hr />
        </div>
        );
};
	

const ComponentA: VFC = () => {
    return (
        <>
            <p>Component A</p>
            <ComponentB />
        </>
    );
};
	

const ComponentB: VFC = () => {
    return (
        <>
            <p>Component B</p>
            <ComponentC />
        </>
    );
};
	

const ComponentC: VFC = () => {
    // useContextで値を受け取り、使用することができる。
    const { count, setCount } = useContext(UserCountContext);
    return (
        <>
            <p>Component C</p>
            <p>{count}</p>
            <button onClick={() => setCount((prev) => prev + 1)}>+</button>
        </>
    );
};
export default UseContextSample;