TECH I.S.

React useContext


React Context

React Contextは、状態をグローバルに管理する方法です。

useStateフックと併用することで、useState単独よりも簡単に、深くネストしたコンポーネント間でステートを共有することができます。

問題

stateは、stateへのアクセスを必要とするスタック内の最上位の親コンポーネントによって保持される必要があります。

例として、ネストされたコンポーネントが多数あるとします。スタックの最上部と最下部のコンポーネントは状態にアクセスする必要があります。

コンテキストなしでこれを行うには、ネストされた各コンポーネントを介して状態を「props」として渡す必要があります。これを「prop drilling」といいます。

例:

ネストされたコンポーネントを介して「props」を渡します。:

import { useState } from "react"; import ReactDOM from "react-dom/client"; function Component1() {   const [user, setUser] = useState("Jesse Hall");   return (     <>       <h1>{Hello ${user}!}</h1>       <Component2 user={user} />     </>   ); } function Component2({ user }) {   return (     <>       <h1>Component 2</h1>       <Component3 user={user} />     </>   ); } function Component3({ user }) {   return (     <>       <h1>Component 3</h1>       <Component4 user={user} />     </>   ); } function Component4({ user }) {   return (     <>       <h1>Component 4</h1>       <Component5 user={user} />     </>   ); } function Component5({ user }) {   return (     <>       <h1>Component 5</h1>       <h2>{Hello ${user} again!}</h2>     </>   ); } const root = ReactDOM.createRoot(document.getElementById('root')); root.render(<Component1 />);

実行例(開発中です。) »

コンポーネント2~4はその状態を必要としないにもかかわらず、コンポーネント5に届くように状態を渡さなければいけませんでした。


ソリューション

解決策は、コンテキストを作成することです。

コンテキストの作成

コンテキストを作成するには、createContextをインポートして初期化する必要があります。:

import { useState, createContext } from "react"; import ReactDOM from "react-dom/client"; const UserContext = createContext()

次に、Context Providerを使用して、state Contextを必要とするコンポーネントのツリーをラップします。

Context Provider

Context Providerで子コンポーネントをラップし、state valueを提供します。

function Component1() {   const [user, setUser] = useState("Jesse Hall");   return (     <UserContext.Provider value={user}>       <h1>{Hello ${user}!}</h1>       <Component2 user={user} />     </UserContext.Provider>   ); }

これで、このツリー内のすべてのコンポーネントがユーザー コンテキストにアクセスできるようになります。

useContextフックを使用します。

子コンポーネントでContextを使用するには、useContextフックを使用してそれにアクセスする必要があります。

まず、インポート ステートメントにuseContextを含めます。:

import { useState, createContext, useContext } from "react";

これで、すべてのコンポーネントのユーザー コンテキストにアクセスできるようになります。

function Component5() {   const user = useContext(UserContext);   return (     <>       <h1>Component 5</h1>       <h2>{Hello ${user} again!}</h2>     </>   ); }


完全な例

例:

React Contextを使用した完全な例を次に示します。

import { useState, createContext, useContext } from "react"; import ReactDOM from "react-dom/client"; const UserContext = createContext(); function Component1() {   const [user, setUser] = useState("Jesse Hall");   return (     <UserContext.Provider value={user}>       <h1>{Hello ${user}!}</h1>       <Component2 />     </UserContext.Provider>   ); } function Component2() {   return (     <>       <h1>Component 2</h1>       <Component3 />     </>   ); } function Component3() {   return (     <>       <h1>Component 3</h1>       <Component4 />     </>   ); } function Component4() {   return (     <>       <h1>Component 4</h1>       <Component5 />     </>   ); } function Component5() {   const user = useContext(UserContext);   return (     <>       <h1>Component 5</h1>       <h2>{Hello ${user} again!}</h2>     </>   ); } const root = ReactDOM.createRoot(document.getElementById('root')); root.render(<Component1 />);

実行例(開発中です。) »



プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細