useContext

์ฝ”๋”ฉ๋•ยท2024๋…„ 4์›” 15์ผ

๐Ÿ’ก UseContext

useContext๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ context๋ฅผ ์ฝ๊ณ  ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š” Hook์ด๋‹ค.

UseContext ์‚ฌ์šฉ๋ฒ•

MyContext.tsx

์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๋ณ€์ˆ˜์™€ ๊ด€๋ฆฌํ™˜๊ฒฝ์„ ์„ ์–ธํ•œ๋‹ค.

// Context API ์„ค์ •ํŒŒ์ผ

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

interface MyContextType {
  myState: number;
  setMyState: React.Dispatch<React.SetStateAction<number>>;
}

const MyContext = createContext<MyContextType | undefined>(undefined); // ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ

export const useMyContext = () => {
  const context = useContext(MyContext);
  if (!context) {
    throw new Error("useMyContext must be used within a MyProvider");
  }
  return context;
};

export const MyProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
  const [myState, setMyState] = useState<number>(0);

  return (
    <MyContext.Provider value={{ myState, setMyState }}>
      {children}
    </MyContext.Provider>
  );
};

index.tsx

์ „์ฒด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Context Provider๋กœ ๊ฐ์‹ผ๋‹ค.

import React from "react";
import ReactDOM from "react-dom/client";
import { RouterProvider } from "react-router-dom";
import router from "./Router";
import { MyProvider } from "./Context/MyContext";

const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);

root.render(
  <React.StrictMode>
    <MyProvider>
      <RouterProvider router={router} />
    </MyProvider>
  </React.StrictMode>
);

UseContext.tsx

Context๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ์“ด๋‹ค.

import { useMyContext } from "../Context/MyContext";

export default function UseContext() {
  const { myState, setMyState } = useMyContext();

  return (
    <div>
      <p>My State: {myState}</p>
      <button onClick={() => setMyState(myState + 1)}>+</button>
    </div>
  );
}

0๊ฐœ์˜ ๋Œ“๊ธ€