見出し画像

React Hooks (useContext)

useContextを呼び出したコンポーネントで、上位のコンポーネントからコンテクストオブジェクトを受け取り、そのコンテクストの現在値を返す。

コンポーネントの階層や、propsが多くなると下層のコンポーネントと
データのやりとりをバケツリレーのようにしなくてはならない。
これが大変面倒なので、そんな時に、useContextを使う。

React.createContextを生成→Context.Providerのvalueに値を渡す→
下層のコンポーネント全てでコンテクストの値を取得出来る。

データを受け取る時に、useContextを使う。
useContextでデータを受け取るコンポーネントはvalueが変わる度に、再レンダーされる。

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

const colors = ["#ff0000", "#00ff00", "#0000ff"];

const ColorsContext = createContext();

// 子供コンポーネント
const Son = () => {
 const { color, hello } = useContext(ColorsContext);
 return (
   <div style={{ color }}>
     子供 <button onClick={hello}>hello</button>
     <Grandson />
   </div>
 );
};

// 孫コンポーネント
const Grandson = () => {
 const { color, hello } = useContext(ColorsContext);
 return (
   <div style={{ color }}>
     孫 <button onClick={hello}>hello</button>
   </div>
 );
};

export default function App() {
 const [index, setIndex] = useState(0);
 const hello = () => {
   alert("hello!");
 };
 return (
   <div className="App">
     <select
       onChange={(e) => {
         setIndex(e.target.value);
       }}
     >
       {colors.map((v, i) => {
         return (
           <option key={v} value={i}>
             {v}
           </option>
         );
       })}
     </select>
     <ColorsContext.Provider
       value={{
         color: colors[index],
         hello
       }}
     >
       <Son />
     </ColorsContext.Provider>
   </div>
 );
}

とても便利。