ReactにおけるuseContextコンテキストフック
このレッスンでは、コンテキストの作業を続けます。
今度はコンポーネントツリーを構築します。
まず、別ファイルでReactコンポーネント
BigBoxを作成します:
function BigBox() {
return (
<p>bigbox</p>
);
}
それをインポートし、メインコンポーネント
Appに配置します:
import BigBox from './BigBox';
function App() {
return (
<BigBox />
);
}
わかりやすくするために、divを少し
スタイリング
します。そのために、ファイル
styles.cssを作成します:
div {
border: 1px solid blue;
margin: 10px;
text-align: center;
max-width: 300px;
}
App.jsにインポートするのを忘れないでください:
import './styles.css';
次に、別ファイルでコンポーネント
MiddleBoxを作成します:
function MiddleBox() {
return (
<p>middlebox</p>
);
}
そして、それを大きな箱
BigBoxの中に配置します:
import MiddleBox from './MiddleBox';
function BigBox() {
return (
<div>
<MiddleBox />
</div>
);
}
小さな箱 SmallBoxでも同じことをすべて行います:
function SmallBox() {
return (
<p>I am ... </p>
);
}
そのような箱を2つ、
MiddleBoxに配置します:
import SmallBox from './SmallBox';
function MiddleBox() {
return (
<div>
<SmallBox />
<SmallBox />
</div>
);
}
ツリーは構築しました。さて、今度は
Appから、例えば SmallBoxに
文字列値 'small box :)'を、
プロップスを使用せずにコンテキストを
利用して渡したいと思います(私たちの箱アプリが
巨大なサイズに成長するかもしれないからです)。
コンテキストファイル MyContext.jsは
前のレッスンですでに作成し、接続しました。
次に行うステップは、BigBoxを
コンテキストオブジェクト MyContextの
プロパティであるコンテキストプロバイダーで
ラップすることです。
これで、この構造に囲まれたすべてのコンポーネント
(BigBoxにネストされたすべての箱も含む)は
コンテキストにアクセスし、変更をサブスクライブ
できるようになります。
コンテキストの値として、希望の
'small box :)'を渡します:
function App() {
return (
<MyContext.Provider value="small box :)">
<BigBox />
</MyContext.Provider>
);
}
あとはコンテキストの値を読み取るだけです。
それを SmallBoxで使用したいので、
コンテキストファイル MyContext.jsと
フック useContextをそこにインポートします:
import { useContext } from 'react';
import { MyContext } from './MyContext.js';
useContextを使用して、コンテキストの値を
変数 nameに読み取ります:
function SmallBox() {
const name = useContext(MyContext);
return (
<div>
<p>I am ... </p>
</div>
);
}
SmallBoxをこのコンテキストにサブスクライブし、
コンテキストが変更された場合、このコンポーネントも
更新されます。
そして最後に、変数 nameの値を
三点リーダーの代わりに代入します:
function SmallBox() {
const name = useContext(MyContext);
return (
<div>
<p>I am {name} </p>
</div>
);
}
空のコンポーネント Appで
コンポーネント Parentを作成し、
その中にコンポーネント Daughterを、
Daughterの中にコンポーネント
Grandsonを作成してください。
コンテキストを使用して、Appから
年齢の値 42を渡し、
useContextを使用して
それをコンポーネント Daughterで
表示してください。
そして今度は、コンポーネント Grandsonで
年齢の値を表示してください。ただし、
2で割った値を表示します。