const TodoContext = createContext(null);
function App () {
const [todos, setTodos] = useState([]);
return (
<TodoContext.Provider value={{todos, setTodos}}>
<TodoForm />
<TodoListWrapper />
</TodoContext.Provider>
);
}
function TodoForm() {
const { setTodos } = useContext(TodoContext);
// TodoContext value 를 읽고 구독하겠다는 뜻!
return (
...
)
}
value를 구독하겠다는 건 value가 변해서 리렌더링되면 나도 같이 리렌더링
function ParentComponent() {
return (
<WrapperComponent>
<ChildComponent />
</WrapperComponent>
)
}
function ParentComponent() {
return (
<WrapperComponent children={<ChildComponent>}>
</WrapperComponent>
)
}
ContextAPI만으로도 전역 상태 관리는 충분할 것 같은데 굳이 Redux를 써야하나? -> ㅇㅇ
(근데 규모가 작은 플젝에서는 ContextAPI로도 충분하긴함)
Redux를 쓰는 이유 1
선택적 상태 구독 용이
// context api
(...생략)
<MyContext.Provider value={{ value1, value2 }}>
{children}
</MyContext.Provider>
(...생략)
// value1만 구조분해할당했어도 MyContext value 전체를 구독
// valu1이 아닌 value2가 바뀌어도 리렌더링
function Component() {
const { value1 } = useContext(MyContext);
return (
...
)
}
// redux
// store 에서 관리중인 전체 상태가 아래라고 가정
(...생략)
const initialState = {
value1: 0,
value2: 0,
};
(...생략)
// 🤩 value1만 구독 -> value1이 바뀔때만 리렌더링!
function Component() {
const value1 = useSelector((state) => state.value1);
return (
...
)
}
이유 2
개발자 도구, Redux DevTools 등 디버깅 용이

필요한 로직들(같은 관심사를 가지고 있는 훅들)을 모아서 만든다 -> 상태를 관리하는 비지니스 로직을 UI랑 분리
커스텀 훅은 return값이 주로 객체임