こもるーとたぬきの備忘録

profile

contextの使い方をまとめたかった話

createContextを久しぶりに使用しようとしたら、どう使っていたっけなってしまった。
加えて、TypeScriptの型定義を今回そこそこ調べたので、備忘録として記録する。
開発環境バージョン
Next.js15.2.1
TypeScript5.0.0
React19.0.0

contextの実装


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

    type UserData = {
      user: string;
      pass: string;
    };

    // useContextで管理したい構造
    type RegistrationContextType = {
      // データ構造そのもの
      userData: UserData;
      // データ構造変更のためのuseStateなHook
      setUserData: React.Dispatch<React.SetStateAction<UserData>>;
    };

    // contextの作成
    // 公式にて「デフォルト値が必要ない場合は null を指定します」とあるため初期値はnull
    export const RegistrationContext = createContext<
      RegistrationContextType | null
    >(null);

    // プロバイダーは、contextの提供者
    // contextを使用したいルートコンポーネントをラップすることでcontextを使用する範囲を指定することができる
    export const RegistrationProvider = ({ children }: { children: ReactNode }) => {
      const [userData, setUserData] = useState<UserData>({
        user: "",
        pass: "",
      });

      return (
        <RegistrationContext.Provider value={{ userData, setUserData }}>
          {children}
        </RegistrationContext.Provider>
      );
    };

    // useContextはその名の通り、contextで管理されているデータにアクセスすることができる関数
    // プロバイダーでラップされた範囲で、この関数を呼び出すことでcontextで管理されているデータを使用することができる。
    export const useRegistrationContext = (): RegistrationContextType => {
      const context = useContext(RegistrationContext);

      if (!context) {
        throw new Error(
          "useRegistrationContext must be used within a RegistrationProvider"
        );
      }

      return context;
    };