Writer: tokuyasu 更新日:2023/11/07
こんにちは、デジナーレ福岡オフィスの徳安です。
この記事では、useContextについて説明します。
useContextとは
useContextはコンポーネントで、
コンテクスト(context)の読みとりと
サブスクライブ(subscribe, 変更の受け取り)を
行うためのReactフック。
1 |
const value = useContext(SomeContext) |
通常、親コンポーネントから
子コンポーネントには
propsを使って情報を渡す。
propsを受け渡す際、
多数の中間コンポーネントを
経由して渡さないといけない場合や、
アプリ内の多くのコンポーネントが
同じ情報を必要とする場合、
propsの受け渡しは冗長で、不便なものになる。
→props drilling(propsのバケツリレー)
と呼ばれる状況に陥る。
そういった際に、
コンテクストを使用することで、
親コンポーネントから、
propsを明示的に受け渡さなくても
任意のコンポーネントが
情報を受け取れるようにできる機能。
=== サンプル ===
コンポーネントのトップレベルで
useContextを呼び出して、
サブスクライブする。
簡単なサンプルを作成してみる。
<ファイル構成>
・propsの受け渡しで、stateを渡す場合
【APP.jsx】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import { useState } from "react"; import SampleA from "./components/SampleA"; const App = () => { const [user, setUser] = useState({ name: "taro", age: 20, }); return ( <div className="App"> <SampleA user={user} /> </div> ); }; export default App; |
【SampleA】
1 2 3 4 5 6 |
import React from "react"; import SampleB from "./SampleB"; const SampleA = ({ user }) => <SampleB user={user} />; export default SampleA; |
【SampleB】
1 2 3 4 5 6 |
import React from "react"; import SampleC from "./SampleC"; const SampleB = ({ user }) => <SampleC user={user} />; export default SampleB; |
【SampleC】
1 2 3 4 5 6 7 8 9 |
const ContextC = ({ user }) => { return ( <p> {user.name}: {user.age}歳です。 </p> ); }; export default ContextC; |
このように親コンポーネントから値を受け渡す際に
バケツリレーで値を受け渡しているため
不要なpropsの受け渡しが発生している。
・contextを使用して、値を受け取れるようにする場合
【APP.jsx】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import { createContext, useState } from "react"; import SampleA from "./components/SampleA"; // UserContextを利用できるようにするためにexportし、 // ContextオブジェクトであるUserContextを作成 export const UserContext = createContext(); const App = () => { const [user, setUser] = useState({ name: "taro", age: 20, }); return ( <div className="App"> {/* providerを作成、valueにuserをセットする */} <UserContext.Provider value={user}> <SampleA /> </UserContext.Provider> </div> ); }; export default App; |
【SampleA.jsx】
1 2 3 4 5 6 7 |
import React from "react"; import SampleB from "./SampleB"; // 不要なpropsの受け渡しがなくなる。 const SampleA = () => <SampleB />; export default SampleA; |
【SampleB.jsx】
1 2 3 4 5 6 7 |
import React from "react"; import SampleC from "./SampleC"; // 不要なpropsの受け渡しがなくなる。 const SampleB = () => <SampleC />; export default SampleB; |
【SampleC.jsx】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import { useContext } from "react"; import { UserContext } from "../App"; const ContextC = () => { //useContextの引数に、UserContextを渡すことによって、 //AppコンポーネントでProviderに渡したvalueの値を変数に代入することが出来る const user = useContext(UserContext); return ( <p> {user.name}: {user.age}歳です。 </p> ); }; export default ContextC; |
useContextを使用すれば、
ツリー内の様々な階層から、
Contextに収容されている
データへアクセスすることができる。
ここまで読み進めていただきありがとうございます。