useContext๋ ์ปดํฌ๋ํธ์์ context๋ฅผ ์ฝ๊ณ ๊ตฌ๋ ํ ์ ์๋ Hook์ด๋ค.
์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ถ์ ๋ณ์์ ๊ด๋ฆฌํ๊ฒฝ์ ์ ์ธํ๋ค.
// 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>
);
};
์ ์ฒด ์ดํ๋ฆฌ์ผ์ด์
์ 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>
);
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>
);
}