20221005 React Hooks - useContext
useContext
์ฌ๋ฌ ๊ณณ์ ์ฐ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค์ฃผ๊ณ ์ถ์ ๋ ์ปดํฌ๋ํธ์ ๋จ๊ณ๊ฐ ๋ง๋ค๋ฉด ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ Prop์ ๋ด๋ ค์ค์ผ ํ๋๋ฐ, ์ด๋ฐ ๋ฌธ์ ์ ์ ํ๋กญ ๋๋ฆด๋ง(Prop Drilling) ์ด๋ผ๊ณ ํจ.
Context๋ ํ๋กญ ๋๋ฆด๋ง์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ธฐ๋ฅ
React Context๋ ์ ์ญ์ ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ์ ์ญ์ ํ๋กญ์ค๋ก ๋จ๊ณ์ ์ผ๋ก ํ๋ ค๊ณ ํ๋ค๊ณ ํ๋ฉด ํ๋ฌ
- ์ปจํ ์คํธ๊ฐ ์ฑ์์์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋๋ก ํด์ค
- ์ ์ญ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ์ ํธํจ
- ์์์ปดํฌ๋ํธ์์ ํ์ํ ๊ฐ์ ๋จ๊ณ๋ก๋ณ๋ก ํตํ๋๊ฒ ์๋๋ผ ๋ฐ๋ก ๋๊ฒจ์ค ์ ์์
- Context๋ก ๊ณต์ ํ๊ฑธ > useContext๋ก ๋ฐ๋ก ๋ฐ์์์ ์ธ ์ ์์
๋จ์ ์ปจํ ์คํธ๋ ๊ผญ ํ์ํ ๋๋ง ์จ์ผ๋ ์ด์
- ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ ์ง ์ ์์
- Prop drilling์ ํผํ๊ธฐ ์ํ ๋ชฉ์ ์ด๋ผ๋ฉด Componemt Composition(์ปดํฌ๋ํธ ํฉ์ฑ)์ ๋ ๊ฐ๋จํ ์๋ ์์
1. App.js ์์ ์ปดํฌ๋ํธ์์ Context๋ฅผ ๋ถ๋ฌ์์ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ์๊ฒ ํ์ํ์ง
2. ํ์ํ ํ์์ปดํฌ๋ํธ๋ useContext๋ฅผ ์ฌ์ฉ(ํ๋กญ์ค ์ฌ์ฉใด)
import { useState, createContext, useContext } from "react";
import ReactDOM from "react-dom/client";
const UserContext = createContext();
function Component1() {
const [user, setUser] = useState("Jesse Hall");
return (
<UserContext.Provider value={user}>
<h1>{`Hello ${user}!`}</h1>
<Component2 />
</UserContext.Provider>
);
}
function Component2() {
return (
<>
<h1>Component 2</h1>
<Component3 />
</>
);
}
function Component3() {
return (
<>
<h1>Component 3</h1>
<Component4 />
</>
);
}
function Component4() {
return (
<>
<h1>Component 4</h1>
<Component5 />
</>
);
}
function Component5() {
const user = useContext(UserContext);
return (
<>
<h1>Component 5</h1>
<h2>{`Hello ${user} again!`}</h2>
</>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Component1 />);
1. Context ๋ง๋ค๊ธฐ
//Context๋ createContext ๋ผ๋ ํจ์๋ฅผ ํตํด ๋ง๋ค ์ ์์
import { createContext } from 'react';
const LocaleContext = createContext();
// ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์ด ์ค ์๋ ์์
import { createContext } from 'react';
const LocaleContext = createContext('ko');
2. Context ์ ์ฉํ๊ธฐ
//Context๋ฅผ ์ธ ๋๋ ๋ฐ๋์ ๊ฐ์ ๊ณต์ ํ ๋ฒ์๋ฅผ ์ ํ๊ณ ์จ์ผ ํจ
// ์ด๋ ๋ฒ์๋ Context ๊ฐ์ฒด์ ์๋ Provider ๋ผ๋ ์ปดํฌ๋ํธ๋ก ์ ํด์ค ์ ์์
// ์ด๋ Provider์ value prop์ผ๋ก ๊ณต์ ํ ๊ฐ์ ๋ด๋ ค์ฃผ๋ฉด ๋จ.
import { createContext } from 'react';
const LocaleContext = createContext('ko');
function App() {
return (
<div>
... ๋ฐ๊นฅ์ ์ปดํฌ๋ํธ์์๋ LocaleContext ์ฌ์ฉ๋ถ๊ฐ
<LocaleContext.Provider value="en">
... Provider ์์ ์ปดํฌ๋ํธ์์๋ LocaleContext ์ฌ์ฉ๊ฐ๋ฅ
</LocaleContext.Provider>
</div>
);
}
3. Context ๊ฐ ์ฌ์ฉํ๊ธฐ
//useContext ๋ผ๋ Hook์ ์ฌ์ฉํ๋ฉด ๊ฐ์ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์์
//์ด๋ ์๊ท๋จผํธ๋ก๋ ์ฌ์ฉํ Context๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋จ
import { createContext, useContext } from 'react';
const LocaleContext = createContext('ko');
function Board() {
const locale = useContext(LocaleContext);
return <div>์ธ์ด: {locale}</div>;
}
function App() {
return (
<div>
<LocaleContext.Provider value="en">
<Board />
</LocaleContext.Provider>
</div>
);
}
์ฐธ๊ณ ๋ฐ ์ถ์
https://ko.reactjs.org/docs/context.html
Context – React
A JavaScript library for building user interfaces
ko.reactjs.org
https://www.w3schools.com/react/react_usecontext.asp
React useContext Hook
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
์ฝ๋์ - React๋ก ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ ๊ฐ์