Warning: count(): Parameter must be an array or an object that implements Countable in /home/xs638785/agile-software.site/public_html/wp-content/plugins/rich-table-of-content/functions.php on line 490
Reactが基本的に持ってるメインストリージもあります。それがcontext
です。
そしてこのcontext
を生成してくれるAPIがContext API
contextの生成
createContext
というメソッドを使って生成できます。
import { createContext } from 'react';
export const LanguageContext = createContext("kr");
このようにcreateContext
で生成したcontext
オブジェクトにはProvider
とConsumer
という特別なReactコンポーネントが入ってます。
Provider
Provider
はvalue props
を用いて子コンポーネントたちにstate
を渡す役割です。Provider
の中にあるすべての子コンポーネントはそのcontext
内のデータにアクセスできます。
import React from 'react';
import LanguageContext from './LanguageContext'; //上で作ったcontext
import MainContent from './MainContent'; //コンポーネント
import Header from './Header'; //コンポーネント
export const App = () => {
return (
<LanguageContext.Provider value="kr">
<div className="App">
<Header />
<MainContent />
</div>
</LanguageContext.Provider>
);
}
これでHeader
とMainContent
がcontext
にアクセスできるようになりました。基本的にはConsumer
でアクセスできます。
Consumer
Consumer
はProvider
から渡されたstate
をもらって使う役割です。
MainContentコンポーネントのコードで表すと
import React from 'react';
import LanguageContext from './LanguageContext';
export const MainContent = () => {
return (
<LanguageContext.Consumer>
{(language) => (
<section language={language}>
//何らかの内容
</section>
)}
</LanguageContext.Consumer>
);
};
Consumer
内の関数でstate
を使うことができます。Provider
のvalue
でkrを渡してましたから、このlanguage
はkrになってるはずです。
useContext
useContext
がやってることはConsumer
と同じですが、Consumer
で囲まなくても渡されたstate
をもらって使わせてくれるhookです。