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に到達できるように、状態を渡す必要がありました。


w3schools CERTIFIED . 2022

認定を受けましょう!

Reactモジュールを完了し、演習を行い、試験を受けて、w3schools認定を取得してください!!

95ドル登録

ソリューション

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

コンテキストの作成

コンテキストを作成するには、コンテキストをインポート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"));