Reactはコンポーネント間のデータの受け渡しは「props」を使用し、
親から子へというのが基本的な考え方となります。
コンポーネントで共通のデータを参照する際に便利なのが「useContext」です。
今回はuseContextを利用してメッセージの切り替えを実装してみようと思います。
Contextとは
Contextとは、propsで渡さなくてもデータを共有できる機能です。
「グローバル変数」とみなすことができ、各コンポーネントからアクセス可能となります。
コンポーネントの階層が深いときになどデータを渡すのに手間がかかりません
useContextとは、Contextのhook版になります。
※hook:Reactの機能をクラスを書かずに使用できるようにしたもの
メッセージ切り替え
3つのコンポーネントを用意して、メッセージの切り替えができるようにします。
文字変更ボタン押下↓
では実際のソースを記載していきます。
App.js
import React, {createContext, useState} from 'react'
import Header from './component/Header'
import Footer from './component/Footer'
import Content from './component/Content'
export const ChangeContext = React.createContext();
function App() {
const [chageContext, setChangeContext] = useState(true);
const value = {
chageContext, setChangeContext
};
return (
<div className="App">
<ChangeContext.Provider value = {value}>
<Header />
<Content />
<Footer />
</ChangeContext.Provider>
</div>
);
}
export default App;
★ポイント
①export const ChangeContext = React.createContext();
コンテクストオブジェクトを作成します。
②const [chageContext, setChangeContext] = useState(true);
useStateを利用することで、各コンポーネントからコンテキストの値を更新できます。
③<ChangeContext.Provider value = {value}>
Provider内のコンポーネントはコンテキストを受け取るが可能になります。
valueにuseStateで生成した値、関数を渡しています。
続いて子コンポーネントのを記載をします。
Header.js
import React, {useContext, useState} from 'react';
import {ChangeContext} from '../App';
import style from '../style/header.module.scss';
const Header = () => {
const {chageContext, _} = useContext(ChangeContext);
return(
<header className={style.header}>
<div>
<h1>
{chageContext ? 'header': 'ヘッダー'}
</h1>
</div>
</header>
)
}
export default Header;
Content.js
import React, {useContext} from 'react';
import {ChangeContext} from '../App';
import style from '../style/content.module.scss';
const Content = () => {
const {chageContext, setChangeContext} = useContext(ChangeContext);
return(
<div className={style.content}>
<h1>
{chageContext ? 'content': 'コンテンツ'}
</h1>
</div>
)
}
export default Content;
Footer.js
import React, {useContext} from 'react';
import {ChangeContext} from '../App';
import style from '../style/footer.module.scss';
const Footer = () => {
const {chageContext, setChangeContext} = useContext(ChangeContext);
return(
<footer className={style.footer}>
<div>
<h1>
{chageContext ? 'footer': 'フッター'}
</h1>
</div>
<button onClick={() => setChangeContext(!chageContext)}>文字変更</button>
</footer>
)
}
export default Footer;
★ポイント
①const {chageContext, setChangeContext} = useContext(ChangeContext);
コンテキストオブジェクトを受け取っています。
※<ChangeContext.Provider value = {value}>のvalueに設定した値と同じ形で変数を準備
コンテキストオブジェクトを変更する必要のないコンポーネントは_にして
使わないことを明示しています。
②{chageContext ? ‘header’: ‘ヘッダー’}
三項演算子を利用して表示する文字を分岐しています
このように各コンポーネントで参照できるので便利ですね。
参考文献
https://ja.reactjs.org/docs/context.html#contextprovider
https://ja.reactjs.org/docs/hooks-reference.html#usecontext
https://reffect.co.jp/react/react-usecontext-understanding