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に収容されている
データへアクセスすることができる。
ここまで読み進めていただきありがとうございます。
 
				




 
								