react로 만든 앱은 여러 개의 컴포넌트로 이루어져 있다.
최상위 앱 컴포넌트에서 시작해서 트리형태로 쭉쭉 뻗어나간다고 보면 된다!
=
이러한 방향으로 props를 통해 전달이 된다.
import useState from "react";
import Header from "./Header";
const App() =>{
const[user,setUser] = useState('');
return <Header user={user}/>
}
export default App;
App(부모)컴포넌트 안에서 Header(자식)컴포넌트를 담고 있다.
그럼 Header 컴포넌트에서
import SearchBar from "./SearchBar";
const Header = ({ user }) => {
return (
<div>
<SearchBar user={user} />
</div>
);
};
export default Header;
이런식으로 user를 받아오고 또 SearchBar(Header의 자식, APP의 손자)에게 user라는 prop을 내려주게 되는 형식이다.
만약 자식의 자식 또 그 자식의 자식이 다 user라는 prop을 필요로 한다면 계속해서 저러한 과정을 지속해야 한다.
최상위 부모(APP)에서 prop을 가지고 있는데
자식은 그 prop을 사용하지 않는다.
그러나 자식의 자식 그 자식의 자식과 같이 완전 하위 컴포넌트에서는 해당 prop을 필요로 하는 상황이라고 하자.
그럼 그 중간에 있는 자식 컴포넌트들은 해당 prop을 사용하지 않는데도, 계속해서 넘겨줘야 한다.
어떻게 보면 필요하지 않는 코드가 추가되는 느낌이다.
또한 전달 과정에서 실수로 이상한 데이터를 전달하거나 데이터를 수정해버리면, 부모컴포넌트를 찾아다니면서 에러를 해결해야 한다.
이렇게 깊숙히 prop을 전달해주는 걸 prop drilling이라고 한다.
react는 이러한 문제점을 해결하기 위해 context api라는 것을 제공해준다.
하위 컴포넌트들은 어디에 있든 필요하면 해당 prop을 사용할 수 있는 것!!!!
props대신 context를 사용해서 데이터를 공유하면 한 곳에 있는 데이터를 각각 자녀 컴포넌트들이 useContext를 활용해서 가져다 쓸 수 있다.
context를 사용하면 컴포넌트를 재사용하기 어려워 질 수 있다.
Context의 주된 목적은 다양한 레벨에 있는 많은 컴포넌트들에게 전역적인 데이터를 전달하기 위함!
react 공식문서에는 Context를 단지 Prop drilling을 피하기 위한 목적이라면 'Component Composition(컴포넌트 합성)을 먼저 고려해보라고 권장한다.
사용법이 궁금하다면
링크텍스트