当サイトは、アフィリエイト広告を利用しています

【ReactHooks】useContextの使いどころ

作成日:2022月03月28日
更新日:2024年02月12日

reacthooksのuseContextの使い方をまとめる。

useContextとは?

ReactのuseContextはコンポーネント間でのデータの受け渡しに関するHook。
Context内に入れたデータはContextプロバイダーの配下のコンポーネントで
共有できるため。配下のコンポーネントであれば参照、更新が自由にできるようになる。

useContextのメリット

メリットとしては下記がある。

  • 複数のコンポーネントでstateと操作を一元管理できる
  • 複数のコンポーネントで同じstateを操作できる
  • 親子コンポーネント間でpropsで連携してくてもよくなる。

useContextの基本の使い方

コンテキストを作成する

createContextを使ってContextを作成する。
使用箇所で使うためexportする

App.js
import React, { createContext } from "react";
export const TestContext = createContext();

コンテキストプロバイダーに値を渡す

作成したContextにはProviderというコンポーネントが付随している。
ContextのデータをこのProviderで囲むようにする

App.js
import "./styles.css";
import React, { createContext } from "react";
import Sample1 from "./sampleComponent1";
import Sample2 from "./sampleComponent2";
// Context作成
export const TestContext = createContext();
export default function App() {
// providerに渡す値を定義
const val = {
id: 1,
name: "ishidaaaaa"
};
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
{/* providerに設定 */}
<TestContext.Provider value={val}>
<Sample1 />
<Sample2 />
</TestContext.Provider>
</div>
);
}

providerで囲んだコンポーネント内ではContextの値を共有できるようになる。
Contextに渡すデータはサンプルではオブジェクトにしているが
配列や値を設定することもできる

useContextフックを使ってデータを取得する

useContextと作成したContext(TestContext)をimportして
値を取得し、表示する

sampleComponent1.js
/** @jsxImportSource @emotion/react */
import { useContext } from "react";
import { TestContext } from "./App";
import { css } from "@emotion/react";
const Sample1 = () => {
// Contextからデータ取得
const { id, name } = useContext(TestContext);
return (
<div css={[container]}>
<div css={item}>{`id:${id}`}</div>
<div css={item}>{`name: ${name} `}</div>
</div>
);
};
export default Sample1;
const container = ()=>[
css`
display:flex;
justify-content:center;
margin:40px;
`
]
const item = ()=>[
css`
flex:1;
border:1px solid black;
`
]

参考

React コンテキストの使い方(useContext)

Context用のコンポーネントを作成して使う

汎用的に使うためContext用のコンポーネントを作成する

Contextの値共有用のコンポーネントを作成する

Context作成し、配下のコンポーネントでContextの値を共有できるように
作成したContextのproviderで引数をラップするコンポーネントを作成する

contextComponent.js
import { createContext, useState, useContext } from "react";
// Context作成
const SampleContext = createContext();
// Contextを取得する関数を作成する
const useSampleContext = () => useContext(SampleContext);
// 引数の要素をproviderでラップするコンポーネント
const SampleProvider = ({ children }) => {
// state
const [count, setCount] = useState(1);
// stateを加算
const add = () => {
setCount((prevCount) => prevCount + 1);
};
// stateを減算
const substract = () => {
setCount((prevCount) => (prevCount !== 0 ? prevCount - 1 : prevCount));
};
// Contextに設定するオブジェクトに値を設定
const contextValue = {
count,
setCount,
add,
substract
};
return (
// 作成したContextのproviderでラップする
<SampleContext.Provider value={contextValue}>
{children}
</SampleContext.Provider>
);
};
// 関数とコンポーネントをexportしておく
export { useSampleContext, SampleProvider };

ラップ用のコンポーネントとContextを取得する関数をexportする。

Contextの値共有用のコンポーネントでラップする

Contextの値を利用したいコンポーネントを
値共有用のコンポーネントで囲む。
これで値共有用のコンポーネントではContextの値が使えるようになる

App.js
import "./styles.css";
import { SampleProvider } from "./contextComponent";
import { SampleA } from "./componentA";
import { SampleB } from "./componentB";
export default function App() {
return (
<div className="App">
<h1>useContext sample</h1>
<SampleProvider>
<SampleA />
<SampleB />
</SampleProvider>
</div>
);
}

Contextの値を利用するコンポーネント

componentAとcomponentBでcontextの値を利用する

componentA

contextから値を取得し、表示と操作を行う。
componetBと利用している値は同じのため、componentAで値を変更すると
componetBの値も変更される

componentA.js
import { useSampleContext } from "./contextComponent";
export const SampleA = () => {
// contextより値を取得
const { count, add, substract } = useSampleContext();
return (
<>
<h2>componetA</h2>
<h2>{count}</h2>
<button onClick={add}>加算</button>
<button onClick={substract}>減算</button>
</>
);
};

componentB

componentB.js
import { useSampleContext } from "./contextComponent";
export const SampleB = () => {
//contexより値を取得
const { count, add, substract, setCount } = useSampleContext();
return (
<>
<h2>componetB</h2>
<h2>{count}</h2>
<button onClick={add}>加算</button>
<button onClick={substract}>減算</button>
<button onClick={() => setCount((prev) => prev * 2)}></button>
</>
);
};

参考

こんなに簡単なの?React Hook useContextでデータ共有

新着記事

タグ別一覧
top