[React] useContext

3階層以上になってくるとpropsをバケツリレーすることになります。親から孫に値を渡すときに一度子を挟まなくてはなりません。これを回避する仕組みがuseContextになります。

種別解説
ContextオブジェクトReact.createContext()の返り値
ProviderコンポーネントContextオブジェクトが保持するコンポーネント
ConsumerコンポーネントuseContext()を利用時にContextオブジェクトの値を取得するコンポーネント

useContextのメリット

useContextを使うとUIとロジックを分離することができます。下記のようなメリットがあります。

  • propsのバケツリレーが無くなる(親から孫へ直接値を渡せる)
  • 複数のコンポーネントで同じ状態を操作できる
  • ステートとイベントハンドラーを1ヶ所で管理できる

ファイル構成

  • components ディレクトリ
    • –B.js
    • –C.js
  • contexts ディレクトリ
    • –ContextTest.js
  • Appjs ファイル

「src」ディレクトリの直下に「contexts」ディレクトリを作ります。ここでcontextを管理します。

ContextTestという変数を作成し、createContext()関数でContextオブジェクトを代入しています。export default ContextTest を記載し、他で使えるようにします。これでcontextを使う下準備は完了です。

「import ContextTest from ‘./contexts/ContextTest’;」

App.js」でcontextが使えるように、contextディレクトリ内に作成した「ContextTest.js」をインポートします。

「import B from ‘./components/B’;」B.jsを使えるようにこちらもインポート。

このような記載になります。<ContextTest.Provider value={‘AからCに値を渡したものを表示’} >

returnの中でContextを使いたい部分を  <ContextTest.Provider></ContextTest.Provider>で囲います。今回はここからCに値を直接渡したいので、渡す値をvalueで設定しています。

App.jsでBを読み込む。BでさらにCを読み込む。値はAからCに渡すという流れになるので、

<ContextTest.Provider></ContextTest.Provider>の中に<B />を記載します。

次にB.jsを作成します。

B.jsはC.jsを読み込んで表示するだけです。

「C.js]にはApp.jsからContextで受け取った値を表示するプログラムを記載します。

まずはcontextをインポートします。「import ContextTest from ‘../contexts/ContextTest’」

「const value = useContext(ContextTest)」

CotextTetをvalueという変数に代入します。

returnの中の表示させたい部分に [value]を記載します。

これでApp.jsで設定した値を直接Cに表示できるようになります。

(表示結果)



Author: webmaster