리액트에서 component가 데이터를 다루는 방법은 props, state, 그리고 context가 있다.
이번 포스팅에서는 context에 대하여 알아보려고 한다.
리액트에서는 props를 통해서 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달해주게 된다.
위의 그림을 보자.
B컴포넌트에서 C컴포넌트에게 데이터를 전달해주고 싶으면 props를 사용해서 전달해주면 된다.
만약, A컴포넌트에 있는 데이터를 D컴포넌트에게 전달해주고 싶다면?
A->B, B->C, C->D 이렇게 넘겨줘도 되지만 매우 번거롭고, B와 C컴포넌트에서는 데이터를 사용하지 않는다면 이 과정 또한 비효율적일 것이다.
이럴 때, 우리는 context를 통해서 하위 컴포넌트들에게 값을 전달해줄 수 있다.
// User.js
import React, { createContext } from 'react';
export const UserContext = createContext();
1️⃣ 먼저, 넘겨주고 싶은 값이 있는 파일에 작성한다.
2️⃣ 새로운 Context를 만들 때는 createContext함수를 사용한다.
3️⃣ 추가한 createContext를 사용하여 Context를 생성한다.
// User.js
import { createContext, useState } from "react";
export const UserContext = createContext();
export default function UserStore(props) {
const [job, setJob] = useState("FE-developer");
const user = {
name: "seeun",
job,
changeJob: (updatedJob) => setJob(updatedJob),
};
return <UserContext.Provider value={user}>{props.children}</UserContext.Provider>
}
위와 같이 컴포넌트에 provider로 감싸주면, 그 하위에 있는 모든 컴포넌트들은 이 context에 저장되어 있는 전역 데이터에 접근할 수 있다.
// App.js
import { BrowserRouter, Routes, Route } from "react-router-dom";
import MainPage from "./components/MainPage";
import TechPage from "./components/TechPage";
import BlogPage from "./components/BlogPage";
import JavascriptPage from "./components/JavascriptPage";
import ReactPage from "./components/ReactPage";
import ReactDocPage from "./components/ReactDocPage";
import UserStore from "./components/User";
function App() {
return (
<UserStore>
<BrowserRouter>
<Routes>
<Route path="/" element={<MainPage />} />
<Route path="tech" element={<TechPage />}>
<Route path="javascript" element={<JavascriptPage />} />
<Route path="react" element={<ReactPage />} />
<Route path="react/:docId" element={<ReactDocPage />} />
</Route>
<Route path="blog" element={<BlogPage />} />
</Routes>
</BrowserRouter>
</UserStore>
);
}
export default App;
<UserStore > 하위에 감싸져 있는 모든 컴포넌트들에서 store에 접근할 수 있는 상태가 되었다.
// BlogPage.js
import React, { useContext } from "react";
import { UserContext } from "../store/user";
export default function BlogPage() {
// UserContext에 있는 useContext를 가지고 옴.
const value = useContext(UserContext);
console.log(value);
return (
<div>
<h1>Blog Page</h1>
</div>
);
}
useContext를 사용하면, 특정한 context에 있는 데이터를 이 파일에서 가지고 올 수 있다.
console 화면에서 데이터를 가지고 오는 것을 확인할 수 있다.