모든 전역 State들을 관리하는 단 하나의 상태 저장소(→단 하나의 객체)
Store: {todos, auth}
store 내부의 리듀서들로부터 각각 최신 상태를 갖는다.
state 변경 함수
{type, payload} 형태의 객체
액션 객체를 인자로 받아 리듀서를 호출 시키는 함수
관리해야할 State 수가 적은 편이면 context API만으로도 충분
확장성, 유지보수성까지 고려해야 한다면 리덕스와 같은 전역 상태 라이브러리를 적용하는 것이 현명한 선택
상태 가져오기 (컴포넌트 자체 → form store)
상태 변경 요청하기(컴포넌트 자체 → to reducer)
const dispatch = useDispatch();
const deleteTodo=(id)=>{
// 단순히 리듀서에게 상태 변경 요청만하는 패턴. 상태변경 로직은 리듀서 안에서 기술
dispatch({type: "todos/DELETE_TODO", payload:id}) // → 리듀서 실행
//dispatch(deleteTodo(id)) // 액션생성자 함수 적용 (휴먼에러 방지)
}
dispatch({type:"ADD_TODO"})라고 하면 액션 객체는 store로 전달되서 모든 리듀서들에게 전달된다. 만약 action type이 todos 리듀서와 auth 리듀서 안에 각각 들어있다면 두 리듀서 함수가 모두 실행되어 예상치 못한 버그를 가질 수 있다!
// 리듀서명 / 액션명의 조함으로 혹여나 중복이 발생하지 않도록 한다.
// modules/todos.js
const ADD_TODO="todos/ADD_TODO";
// modules/auth.js
const ADD_TODO="auth/ADD_TODO";
// ❌ 불필요하게 리렌더링이 발생할 수 있음.
const store = useSelector(state => state);
const todos = store.todos;
// ⭕ Good!!
const todos = useSelector(state => state.todos);