useContextフックに反応する
Reactコンテキスト
React Contextは、状態をグローバルに管理する方法です。
フックと一緒に使用すると、単独useState
の場合よりも簡単に、深くネストされたコンポーネント間で状態を共有できます。useState
問題
状態は、状態へのアクセスを必要とするスタック内の最上位の親コンポーネントによって保持される必要があります。
説明のために、ネストされたコンポーネントが多数あります。スタックの最上部と最下部にあるコンポーネントは、状態にアクセスする必要があります。
コンテキストなしでこれを行うには、ネストされた各コンポーネントを介して状態を「小道具」として渡す必要があります。これは「プロップドリル」と呼ばれます。
例:
ネストされたコンポーネントを介して「小道具」を渡す:
import { useState } from "react";
import ReactDOM from "react-dom";
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>
</>
);
}
ReactDOM.render(<Component1 />, document.getElementById("root"));
コンポーネント2〜4は状態を必要としませんでしたが、コンポーネント5に到達できるように、状態を渡す必要がありました。
ソリューション
解決策は、コンテキストを作成することです。
コンテキストの作成
コンテキストを作成するには、コンテキストをインポートcreateContext
して初期化する必要があります。
import { useState, createContext } from "react";
import ReactDOM from "react-dom";
const UserContext = createContext()
次に、コンテキストプロバイダーを使用して、状態Contextを必要とするコンポーネントのツリーをラップします。
コンテキストプロバイダー
子コンポーネントをコンテキストプロバイダーでラップし、状態値を指定します。
function Component1() {
const [user, setUser] = useState("Jesse Hall");
return (
<UserContext.Provider value={user}>
<h1>{`Hello ${user}!`}</h1>
<Component2 user={user} />
</UserContext.Provider>
);
}
これで、このツリーのすべてのコンポーネントがユーザーコンテキストにアクセスできるようになります。
useContext
フックを使用する
useContext
子コンポーネントでコンテキストを使用するには、フックを使用してコンテキストにアクセスする必要があります。
まず、useContext
インポートステートメントにを含めます。
import { useState, createContext, useContext } from "react";
次に、すべてのコンポーネントのユーザーコンテキストにアクセスできます。
function Component5() {
const user = useContext(UserContext);
return (
<>
<h1>Component 5</h1>
<h2>{`Hello ${user} again!`}</h2>
</>
);
}
完全な例
例:
ReactContextを使用した完全な例を次に示します。
import { useState, createContext, useContext } from "react";
import ReactDOM from "react-dom";
const UserContext = createContext();
function Component1() {
const [user, setUser] = useState("Jesse Hall");
return (
<UserContext.Provider value={user}>
<h1>{`Hello ${user}!`}</h1>
<Component2 user={user} />
</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>
</>
);
}
ReactDOM.render(<Component1 />, document.getElementById("root"));