index.html
<body>
<button id="add">Add</button>
<span>0</span>
<button id="minus">Minus</button>
</body>
index.js
const add = document.getElementById("add");
const minus = document.getElementById("minus");
const number = document.querySelector("span");
let count = 0;
number.innerText = count;
const updateText = () => {
number.innerText = count;
}
const handleAdd = () => {
count = count + 1;
updateText();
}
const handleMinus = () => {
count = count - 1;
updateText();
}
add.addEventListener("click", handleAdd);
minus.addEventListener("click", handleMinus);
Handle 함수에서 update 함수를 호출하여 값이 바뀌었다는 것을 알려주어야 한다.
1. redux 설치
yarn add redux
npm install redux
2. create store
, add reducer(modifier)
import { createStore } from "redux";
const countModifier = (state = defaultValue) => {
// ... modifying state
return state; // modified state
};
const countStore = createStore(countModifier);
store
?
: 하나의 데이터(state)를 저장하는 공간
reducer
?
: state를 변화시킬 수 있는 유일한 함수
store
의 Methods
dispatch
, getState
, subscribe
, replaceReducer
로 총 4개getState()
로 state의 값을 가져올 수 있다.3. action
으로 state의 변경 방법 설정
const countModifier = (count = 0, action) => {
if (action.type == "ADD") {
return count + 1;
} else if (action.type == "MINUS") {
return count - 1;
} else {
return count;
}
};
const countStore = createStore(countModifier);
countStore.dispatch({ type: "ADD" });
action
?
dispatch
를 이용해 action이 적용된 modifier를 호출한다.dispatch
?
object { type: "actionName" }
을 인자로 받는다.
store.dispatch({ type : "action1" })
이 호출되면
→ store.modifier( state, action: { type : "action1" } )
이 실행됨.
4. subscribe
으로 store의 변화 감지하고, 감지 시 html 변경 하기
...
const onChange = () => number.innerText = countStore.getState();
countStore.subscribe(onChange);
const handleAdd = () => countStore.dispatch({ type: "ADD" });
const handleMinus = () => countStore.dispatch({ type: "MINUS" });
add.addEventListener("click", handleAdd);
minus.addEventListener("click", handleMinus);
subscribe
?
: store안의 변화를 감지하고, 감지되었을 때 인자로 받은 함수를 실행한다.
5. Refactor
modifier
의 action을 switch문을 이용하여 풀기. (일반적인 패턴)const countModifier = (count = 0, action) => {
switch (action.type) {
case "ADD":
return count + 1;
case "MINUS":
return count - 1;
default:
return count;
}
};
const ADD = "ADD";
const MINUS = "MINUS";
const countModifier = (count = 0, action) => {
switch (action.type) {
case ADD:
return count + 1;
case MINUS:
return count - 1;
default:
return count;
}
};
// ...
const handleAdd = () => countStore.dispatch({ type: ADD });
const handleMinus = () => countStore.dispatch({ type: MINUS });
import { createStore } from "redux";
const add = document.getElementById("add");
const minus = document.getElementById("minus");
const number = document.querySelector("span");
number.innerText = 0;
const ADD = "ADD";
const MINUS = "MINUS";
const countModifier = (count = 0, action) => {
switch (action.type) {
case ADD:
return count + 1;
case MINUS:
return count - 1;
default:
return count;
}
};
const countStore = createStore(countModifier);
const onChange = () => number.innerText = countStore.getState();
countStore.subscribe(onChange);
const handleAdd = () => countStore.dispatch({ type: ADD });
const handleMinus = () => countStore.dispatch({ type: MINUS });
add.addEventListener("click", handleAdd);
minus.addEventListener("click", handleMinus);