当サイトは、アフィリエイト広告を利用しています
reacthooksのuseContextの使い方をまとめる。
ReactのuseContextはコンポーネント間でのデータの受け渡しに関するHook。
Context内に入れたデータはContextプロバイダーの配下のコンポーネントで
共有できるため。配下のコンポーネントであれば参照、更新が自由にできるようになる。
メリットとしては下記がある。
createContextを使ってContextを作成する。
使用箇所で使うためexportする
import React, { createContext } from "react";export const TestContext = createContext();
作成したContextにはProviderというコンポーネントが付随している。
ContextのデータをこのProviderで囲むようにする
import "./styles.css";import React, { createContext } from "react";import Sample1 from "./sampleComponent1";import Sample2 from "./sampleComponent2";// Context作成export const TestContext = createContext();export default function App() {// providerに渡す値を定義const val = {id: 1,name: "ishidaaaaa"};return (<div className="App"><h1>Hello CodeSandbox</h1>{/* providerに設定 */}<TestContext.Provider value={val}><Sample1 /><Sample2 /></TestContext.Provider></div>);}
providerで囲んだコンポーネント内ではContextの値を共有できるようになる。
Contextに渡すデータはサンプルではオブジェクトにしているが
配列や値を設定することもできる
useContextと作成したContext(TestContext)をimportして
値を取得し、表示する
/** @jsxImportSource @emotion/react */import { useContext } from "react";import { TestContext } from "./App";import { css } from "@emotion/react";const Sample1 = () => {// Contextからデータ取得const { id, name } = useContext(TestContext);return (<div css={[container]}><div css={item}>{`id:${id}`}</div><div css={item}>{`name: ${name} `}</div></div>);};export default Sample1;const container = ()=>[css`display:flex;justify-content:center;margin:40px;`]const item = ()=>[css`flex:1;border:1px solid black;`]
汎用的に使うためContext用のコンポーネントを作成する
Context作成し、配下のコンポーネントでContextの値を共有できるように
作成したContextのproviderで引数をラップするコンポーネントを作成する
import { createContext, useState, useContext } from "react";// Context作成const SampleContext = createContext();// Contextを取得する関数を作成するconst useSampleContext = () => useContext(SampleContext);// 引数の要素をproviderでラップするコンポーネントconst SampleProvider = ({ children }) => {// stateconst [count, setCount] = useState(1);// stateを加算const add = () => {setCount((prevCount) => prevCount + 1);};// stateを減算const substract = () => {setCount((prevCount) => (prevCount !== 0 ? prevCount - 1 : prevCount));};// Contextに設定するオブジェクトに値を設定const contextValue = {count,setCount,add,substract};return (// 作成したContextのproviderでラップする<SampleContext.Provider value={contextValue}>{children}</SampleContext.Provider>);};// 関数とコンポーネントをexportしておくexport { useSampleContext, SampleProvider };
ラップ用のコンポーネントとContextを取得する関数をexportする。
Contextの値を利用したいコンポーネントを
値共有用のコンポーネントで囲む。
これで値共有用のコンポーネントではContextの値が使えるようになる
import "./styles.css";import { SampleProvider } from "./contextComponent";import { SampleA } from "./componentA";import { SampleB } from "./componentB";export default function App() {return (<div className="App"><h1>useContext sample</h1><SampleProvider><SampleA /><SampleB /></SampleProvider></div>);}
componentAとcomponentBでcontextの値を利用する
contextから値を取得し、表示と操作を行う。
componetBと利用している値は同じのため、componentAで値を変更すると
componetBの値も変更される
import { useSampleContext } from "./contextComponent";export const SampleA = () => {// contextより値を取得const { count, add, substract } = useSampleContext();return (<><h2>componetA</h2><h2>{count}</h2><button onClick={add}>加算</button><button onClick={substract}>減算</button></>);};
import { useSampleContext } from "./contextComponent";export const SampleB = () => {//contexより値を取得const { count, add, substract, setCount } = useSampleContext();return (<><h2>componetB</h2><h2>{count}</h2><button onClick={add}>加算</button><button onClick={substract}>減算</button><button onClick={() => setCount((prev) => prev * 2)}>倍</button></>);};