React HooksのuseContextを動かしてみる

React HooksのuseContextは、useStateのようなコンポーネントに閉じた変数を、グローバル変数のように扱えるようにするHooksとのこと。

contextを定義してやり、TestContextProviderをルーティング定義の大元に付与してやる。そして、利用したいコンポーネントでuseContextを利用すれば良い。

以下のサンプルは、グローバルで利用可能な変数をインクリメントするだけのもの。

context.tsx

import React, { createContext, useState, useCallback } from 'react';

interface TestContextType {
  data: number;
  updateData: (data: number) => void;
}

// Contextの作成
export const TestContext = createContext<TestContextType>({
  data: 0,
  updateData: () => {},
});

// Contextの設定(カスタムフック)
export function useTestContext(): TestContextType {
  const [data, setData] = useState(0);
  const updateData = useCallback((newData: number): void => {
    setData(newData);
  }, []);

  return {
    data,
    updateData,
  };
}

// Context Providerコンポーネント
export const TestContextProvider: React.FC<React.PropsWithChildren> = ({ children }) => {
  const contextValue = useTestContext();

  return (
    <TestContext.Provider value={contextValue}>
      {children}
    </TestContext.Provider>
  );
};

index.tsx:ルーティングを設定したファイル

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import Test from "./Test";
import TestContextPage from "./TestContextPage";
import { BrowserRouter, Route, Routes } from "react-router-dom";
import reportWebVitals from './reportWebVitals';
import { TestContextProvider } from './context';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <React.StrictMode>
    <TestContextProvider>
      <BrowserRouter>
        <Routes>
          <Route path="/" element={<App />} />
          <Route path="/test" element={<Test />} />
          <Route path="/testcontext" element={<TestContextPage />} />
        </Routes>
      </BrowserRouter>
    </TestContextProvider>
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

contextを利用するコンポーネント

TextContextPage.tsx

import React, { useContext } from 'react';
import { TestContext, TestContextProvider } from './context';

function Example() {
  const { data, updateData } = useContext(TestContext);

  return (
      <div>
        <p>{data}回押したよ</p>
        <button onClick={() => updateData(data + 1)}>
          ボタン
        </button>
      </div>
  );
}

export default Example;

この記事が気に入ったらサポートをしてみませんか?