はじめに
useContextの基本を簡潔にまとめる😊
この記事で伝えたいこと
- useContextって何?
- コンテキストって何?
- どんなときに便利?
- 使い方は?
useContextとは
✅コンテキストを作成するフック。
コンテキストって何?
✅めちゃくちゃ噛み砕いて言うとグローバル変数みたいなやつ💭
- コンテキストは「アプリケーション全体」や「特定のコンポーネントツリー内」でデータを共有する仕組み。
- 複数のコンポーネントで同じコンテキストを使っておけば、一斉に状態の切り替えができる。
コンテキストがないと…
✅色々なコンポーネントで使うデータを毎回propsで受け渡しするのが面倒くさい💦
- propsを子孫のコンポーネントに値を渡すのが面倒(propsを親→子→孫とバケツリレーが必要)💦
- 特にアプリケーション全体で共有したいデータは、色々なコンポーネントにpropsを渡しまくることになる💦
コンテキストを使うと…
✅色々なコンポーネントで使うデータをpropsなしで受け渡しできる😊
- propsを親→孫に直接データを渡せる😊
- アプリケーション全体で共有するのも簡単😊
【補足】コンテキストとグローバル変数の違い
コンテキストは状態を持つ
コンテキストの値が変更されると、そのコンテキストを使用しているコンポーネントが更新される。
(グローバル変数は変更しても更新されない。)
コンテキストは特定のコンポーネントツリー内だけでデータ共有することができる
特定のコンポーネントツリー(親→子→孫→…)の中でだけデータを共有できる。
(グローバル変数はアプリケーション全体で共有することなりにカプセル化が微妙)
どんなときに便利?
- テーマ設定(ライトテーマとダークテーマの切り替えなど)
- 言語設定
- ユーザー認証に関するデータ(ログイン状態、ログイン関数、ログアウト関数など)
使い方
コンテキストの作成
-
createContext(デフォルト値)
でコンテキストを作成する。-
デフォルト値
の指定は必須。
-
例
SampleContext.js
import React from 'react';
// ✅コンテキストを作成
const SampleContext = React.createContext("これはコンテキストです");
export default SampleContext;
コンテキストの呼び出し
-
作成したコンテキストを使いたいときは
useContext(作成したコンテキスト);
で呼び出せる。
例
App.jsx(Hogeコンポーネントを呼び出しているだけ)
※このファイルは特に意味がないので無視してOK。
※後で説明する「デフォルト値以外を使う」と見比べて分かりやすいように書いている。
import React from 'react';
import Hoge from './Hoge';
const App = () => {
return (
<Hoge />
);
};
Hoge.jsx
import React, { useContext } from 'react';
import SampleContext from './SampleContext';
const Hoge = () => {
// ✅コンテキストを呼び出す
const contextValue = useContext(SampleContext);
return <div>{contextValue}</div>;
};
export default Hoge;
実行結果
作成時に設定したデフォルト値"これはコンテキストです"
が取得できる。
<div>これはコンテキストです</div>;
コンテキストの呼び出し(デフォルト値以外を使う)
-
先ほどの例では
useContext(SampleContext);
でデフォルト値"これはコンテキストです”
が取得できた。 -
Providerを使うとコンテキストを任意の値に上書きできる。
-
例:
"これはコンテキストです”
→"これは上書きされたコンテキストです"
に上書きする。
-
例:
例
App.jsx
import React from 'react';
import SampleContext from './SampleContext';
import Hoge from './Hoge';
const App = () => {
return (
{/* ✅Providerを使って上書き! */}
<SampleContext.Provider value="これは上書きされたコンテキストです">
<Hoge />
</SampleContext.Provider>
);
};
Hoge.jsx(さっきと同じ)
import React, { useContext } from 'react';
import SampleContext from './SampleContext';
const Hoge = () => {
const contextValue = useContext(SampleContext);
return <div>{contextValue}</div>;
};
export default Hoge;
実行結果
Providerで設定した値"これは上書きされたコンテキストです"
が取得できる。
<div>これは上書きされたコンテキストです</div>;
解説
{/* ✅Providerを使って上書き! */}
<SampleContext.Provider value="これは上書きされたコンテキストです">
<Hoge />
</SampleContext.Provider>
最初の例との違いは<Hoge>の外にProviderがあるかどうか。
Providerでラップすることで、SampleContext
の値が上書きできる✨
-
Providerがないとき(最初の例)
-
<Hoge>でコンテキスト
SampleContext
を呼び出す。→デフォルト値
"これはコンテキストです”
が取得できる。
-
<Hoge>でコンテキスト
-
Providerがあるとき(今回の例)
-
<Hoge>でコンテキスト
SampleContext
を呼び出す。→Providerで上書きした
"これは上書きされたコンテキストです"
が取得できる。
-
<Hoge>でコンテキスト
<Hoge>以下のすべての子コンポーネントで上書きが適用される。
参考サイト