Prop Drilling 은 props를 오로지 하위 컴포넌트로 전달하는 용도로만 쓰이는 컴포넌트들을 거치면서 React Component 트리의 한 부분에서 다른 부분으로 데이터를 전달하는 과정입니다.
만약에 마이페이지에서 프로필로 데이터를 전달 하고 싶다면
마이페이지 -> 내정보 -> 프로필
이런식으로 props를 계속 전달해야해요 위와같이 3개정도만 파고 든다면 별 문제 되겠어? 라고 생각이 들겠지만 10개 15개로 넘어가는순간 props가 어디에서 왔는지 찾기가 어려워져요
그렇기에 전역 상태관리를 하는 GlobalState의 중요성이 나오는거죠
하나의 state가 여러 페이지에서 필요한 경우,
매번 props로 나눠주기 번거롭기 때문에
여러 컴포넌트에 사용되는 Global State가 필요함
fetchPolicy가 내장된 REST-API용
주로 백엔드 state를 저장하는곳은
React-query , Apollo-Client
주로 프론트 state를 저장하는곳은
Recoil
둘다 하는거는
Redux
현재 트렌드는
Redux-toolkit , React-Query + Recoli , Apollo-Client + Recoli
//_app.tsx 파일
import { RecoilRoot } from 'recoil';
function App() {
return (
<RecoilRoot>
...
<Component />
...
</RecoilRoot>
);
}
// src/component/commons/stores
const textState = atom({
key: 'textState', // state의 이름
default: '', //초기값
});
컴포넌트는 자신이 필요한 atom을 참조하고 자신이 참조하는 Atom에 변화가 있으면 atom을 참조하는 모든 컴포넌트에서 리렌더링 발생해요
import { useRecoilState } from "recoil";
import { textState } from "../../src/components/commons/stores";
function TextInput() {
const [text, setText] = useRecoilState(textState);
const onChange = (event) => {
setText(event.target.value);
};
return (
<div>
<input type="text" value={text} onChange={onChange} />
<br />
Echo: {text}
</div>
);
}
recoil은 useRecoilState
을 이용하여 사용해야해요
축약 작성법
const [text] = useRecoilState(textState);
데이터만만 사용할 경우에는 뒤에 set은 안해도 상관없음
const [, setText] = useRecoilState(textState);
set만 사용할 경우에는 앞에 콤마만 붙이고 사용해도 상관 없음
위에 익스텐션을 다운받으면 좀 더 편리하게 recoil을 작성할 수 있어요