Context : 전역적으로 사용되는 어떠한 것을 표현할 때 사용
prop drilling 현상을 막기 위해 react context API가 나왔고
-> useContext hook을 통해 쉽게 전역 데이터를 관리할 수 있게 됨
출처 : https://www.copycat.dev/blog/react-context/
prop drilling에 대한 내용은 아래 게시글을 눌러 확인!
prop drilling 설명
// App.jsx
import GrandFather from './components/GrandFather'
function App() {
return (
<GrandFather />
)
}
export default App
// GrandFather.jsx
import React from 'react'
import Father from './Father';
function GrandFather() {
const houseName = '스파르타';
const pocketMoney = 10000;
return (
<Father houseName={houseName} pocketMoney={pocketMoney} />
)
}
export default GrandFather
// Father.jsx
import React from 'react'
import Child from './Child'
function Father({houseName, pocketMoney}) {
return (
<Child
houseName={houseName} pocketMoney={pocketMoney}
/>
)
}
export default Father
// Child.jsx
import React from 'react'
const style = {
color: 'red',
fontWeight: '900',
};
function Child({houseName, pocketMoney}) {
return (
<div>
나는 이 집안의 막내예요!
<br />
할아버지가 우리 집 이름은 <span style={style}>{houseName}</span>라고 하셨어요.
<br />
게다가 용돈도 <span style={style}>{pocketMoney}</span>원 만큼이나 주셨어요!
</div>
)
}
export default Child
// FamilyContext.js
import { createContext } from "react";
export const FamilyContext = createContext(null);
// GrandFather.jsx
import React from 'react'
import Father from './Father';
import { FamilyContext } from '../context/FamilyContext';
function GrandFather() {
const houseName = '스파르타';
const pocketMoney = 10000;
/* Provider: 제공해주는자, 공급해주는자 라는 뜻으로,
Father 컴포넌트 밑으로 이 컨텍스트를 제공해준다는 것이다.
그리고 property로 value를 넘겨준다. */
return (
<FamilyContext.Provider value={{
// key: value를 가져야하지만 key와 value가 같다면 value 생략 가능
houseName,
pocketMoney,
}}>
/* 원래 Father > Child 로 내려주는 props가 있었는데
useContext를 사용하면 안내려줘도 됨 */
<Father />
</FamilyContext.Provider>
)
}
export default GrandFather
// Father.jsx
import React from 'react'
import Child from './Child'
// 여기도 더이상 Child 컴포넌트에 내려줄 props를 가져오지 않아도 됨
function Father() {
return (
<Child />
)
}
export default Father
// Child.jsx
import React, { useContext } from 'react'
import { FamilyContext } from '../context/FamilyContext';
const style = {
color: 'red',
fontWeight: '900',
};
// Child 컴포넌트에서도 props에 의존하는 것이 아니라 useContext에 의존한다.
function Child() {
// context로부터 데이터를 받아온다. -> useContext 뒤에는 해당 컴포넌트가 들어온다.
const data = useContext(FamilyContext);
return (
<div>
나는 이 집안의 막내예요!
<br />
// 이제 props를 이용하는게 아니라 context
할아버지가 우리 집 이름은 <span style={style}>{data.houseName}</span>라고 하셨어요.
<br />
게다가 용돈도 <span style={style}>{data.pocketMoney}</span>원 만큼이나 주셨어요!
</div>
)
}
export default Child
리액트를 앞에서부터 조금씩 배우면서 느끼는거지만 '무조건 이게 좋다!' 하는 최고의 한 가지는 없고 그 대안을 위해 계속 무언가가 생기는 것이 참 신기했다. 그 당시에는 그게 가장 좋다고 생각했는데 단점이 나타나고, 그 단점을 메꾸기 위해 또 다른 것들이 생겨나고 그것들이 반복되어서 리액트라는 큰 덩어리가 된 것을 보니까 사람도 발전되는 모양새가 비슷하다는 것을 느꼈다. ㅎㅎ.. 코드를 보면서 이런 생각이 나는 걸 보니 기본 문과생은 어쩔 수 없나보다 🤣