Contextを利用するとpropsのバケツリレーをせずに、複数コンポーネント間でデータを利用できます。「styleのtheme情報管理」や「locale情報管理」などで活用されていることがあります。ここでは「Contextの作成方法」「Context値の取得方法」を確認します。
目次
フォルダ構造
以下フォルダ構成で構築したReactアプリにて動作確認をしました。
src/
├── components
│ └── Sample.tsx // 「Hooks API(useContext)」 でContext値を取得
├── App.tsx
├── contexts.ts // 「createContext」 で2つのContextを作成
└── index.tsx // 「Context.Provider」 で配下コンポーネントにContextを提供
Contextを作成
( React.createContext
)
src/contexts.ts
createContext
を利用して2つの Contextオブジェクト
を作成しています。
import { createContext } from 'react';
type XxxContextValue = {
x: string | null;
};
export const XxxContext = createContext<XxxContextValue>({} as XxxContextValue);
type YyyContextValue = {
y: string | null;
};
export const YyyContext = createContext<YyyContextValue>({} as YyyContextValue);
Contextを配下コンポーネントに提供
( Context.Provider
)
src/index.tsx
作成したContextをコンポーネントで利用できるようにするには、Providerコンポーネント
を利用します。
Providerコンポーネント
は、先ほど作成した Contextオブジェクト
のプロパティに格納されています。
import React from 'react';
import ReactDOM from 'react-dom';
import App from 'App';
import { XxxContext, YyyContext } from 'contexts';
ReactDOM.render(
<React.StrictMode>
<XxxContext.Provider value={{ x: 'Hello' }}>
<YyyContext.Provider value={{ y: 'World' }}>
<App />
</YyyContext.Provider>
</XxxContext.Provider>
</React.StrictMode>,
document.getElementById('root'),
);
コンポーネントからContext値を読み取り
( useContext
)
src/App.tsx
import React, { FC } from 'react';
import Sample from 'components/Sample';
const App: FC = () => {
return (
<div style={{ padding: '12px', width: '400px', backgroundColor: '#ccc' }}>
<h1>App</h1>
<Sample samplePropData="Data passed from parent." />
</div>
);
};
export default App;
src/components/Sample.tsx
Context値を読み取るには、Hooks APIの useContext
を利用します。
useContext
の引数に Contextオブジェクト
を指定することでContext値を取得できます。
import React, { FC, useContext } from 'react';
import { XxxContext, YyyContext } from 'contexts';
type Props = {
samplePropData?: string;
};
const Sample: FC<Props> = ({ samplePropData }) => {
const xxxContextValue = useContext(XxxContext);
const yyyContextValue = useContext(YyyContext);
return (
<div style={{ padding: '12px', backgroundColor: '#eee' }}>
<h1>Sample Component</h1>
<p>samplePropData: {samplePropData}</p>
<h2>xxxContext</h2>
<p>xxxContextValue.x: {xxxContextValue.x}</p>
<h2>yyyContext</h2>
<p>yyyContextValue.y: {yyyContextValue.y}</p>
</div>
);
};
export default Sample;
動作確認
useContext
でコンテキスト値を読み取れていることを確認できました。