switch문
의 case의 action.type
을"ADD_COUNT"
라고 하드코딩 해놓은 것을 볼 수 있다.<counter.js>
// 초기 상태값 (state 같은 것)
const initialState = {
number: 0,
};
// counter 리듀서 (state 변경 함수 같은 것)
const counter = (state = initialState, action) => {
switch (action.type) { // switch문을 통해 type에 따라 작동할 코드를 설정
case "ADD_COUNT":
return { number: state.number + 1 } // initialState의 값을 업데이트
default:
return state;
}
};
// export default 한다.
export default counter;
그렇다면 reducer
를 사용해서 action
을 전송할 때마다
아래와 같이 "ADD_COUNT"
라는 타입을 매번 하드코딩 해야하는데
const addCount = () => {
dispatch({type:"ADD_COUNT"}}); // {type: "ADD_COUNT"} 이거를 매번 써야 됨.
}
만약 사용하는 곳이 100군데인데
reducer의 타입명을 바꾸자는 제안이 들어왔다면..?
module에서 수정 한번 하고,
100군데를 다 찾아가서 문자열을 수정해줘야 하는 것이다😨
그런 상황을 막기 위해 Ducks 패턴의
Action Value
, Action Creator
가 있는 것이다!
action.type
을 미리 변수에 할당해두는 것이다.<counter.js>
////////////////
// ACTION VALUE
////////////////
const ADD_COUNT = "ADD_COUNT"
const initialState = {
number: 0,
};
// counter 리듀서
const counter = (state = initialState, action) => {
switch (action.type) { // switch문을 통해 type에 따라 작동할 코드를 설정
case ADD_COUNT:
return { number: state.number + 1 }
default:
return state;
}
};
export default counter;
Action value
를 필요한 컴포트넌트마다Action creator
가 담당한다.return {type:ADD_COUNT}
하도록 하는 것이 Action creator
다.<counter.js>
// ACTION VALUE
const ADD_COUNT = "ADD_COUNT"
//////////////////
// ACTION CREATOR
//////////////////
export const addCount = () => {
return {type: ADD_COUNT}
}
const initialState = {
number: 0,
};
// counter 리듀서
const counter = (state = initialState, action) => {
switch (action.type) { // switch문을 통해 type에 따라 작동할 코드를 설정
case ADD_COUNT:
return { number: state.number + 1 }
default:
return state;
}
};
export default counter;
action creator
를 import 한다.action creator 함수
를 호출.action creator
가 작동하며{type:ADD_COUNT}
를// module에서 Action creator import
import { addCount } from "./redux/modules/counter";
import { useDispatch, useSelector } from "react-redux";
function App() {
const counter = useSelector((state) => state.counter);
const user = useSelector((state) => state.user);
const dispatch = useDispatch();
const plusCount = () => {
// Action Creator가 작동하며
// dispatch는 return 된 {type:ADD_COUNT} 를 reducer에 전달
dispatch(addCount());
};
이렇게 하면
이제 사용처를 찾아다니면서 수정 할 필요없이
module의 action creator 하나만 수정해도
모든 사용처에 적용이 되도록 할 수 있다!
Ducks 패턴 끝!
역시 디자인 패턴은 다 이유가 있구나.
몹시 효율적이다!