๐ย ย ์๋ฒฝ๊ณต๋ถ
ํ๋ก ํธ์๋ ๊ธฐ์ ์ ๋ฐ๋ฌ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ๊ณ ๋ํ ๋๋ฉด์, ๊ท๋ชจ์ ๋ง๋ ์์ ์ ์ธ ์ํ ๊ด๋ฆฌ ํจํด์ด ํ์ํด์ก๋ค. ์์ธก ๋ถ๊ฐ๋ฅ์ฑ์ ํด๊ฒฐํ๊ณ ์, ๋จ๋ฐฉํฅ์ ํ๋ฆ์ผ๋ก ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋์๋ค.
์ฆ, ์ํ ๊ด๋ฆฌ ๋ฐฉ๋ฒ๋ก ๊ฐ์ ์ ์ํด ๋์๋ค.
๊ธฐ๋ณธ React ๊ธฐ๋ฅ๋ง์ผ๋ก ๋์ํ๊ธฐ ํ๋ค ์ ๋๋ก ์ํ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ก๋ค๊ณ ํ์คํ ํ๋จ์ด ๋์์ ๋ ์ฌ์ฉํ๋ผ๊ณ ๊ณต์๋ฌธ์์ ๋์์๋ค.
๋ชจ๋ ์ํ๋ ํ๋์ ์ ์ฅ์ ์์ ์ ์ฅ
๋ฆฌ๋์ค์ ์ํฏ๊ฐ์ ์์ ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ก์
๊ฐ์ฒด์ ํจ๊ปย dispatch
๋ฅผ ํธ์ถํ๋ ๊ฒ (๋ง์นย setState
)์ด๋ค.
๋ณํ์ ๋ํ ์์ธก ๊ฐ๋ฅ์ฑ์ ์ป์ ์ ์๋ค.
๋ณด์๋ง์ ์ด๋ค ๊ฐ์ด ๋์ฌ์ง ์์ ๊ฐ๋ฅํ ํจ์์ด๋ค.
// ์์ธก ๊ฐ๋ฅ = ์์ ํจ์
const add = (num) => num + 1;
add(1)
// ์์ธจ ๋ถ๊ฐ๋ฅ โ ์์ ํจ์
const add2 = (num) => num + Math.random();
add2(1)
ํ์๊ฐ (๊ทธ ์ธ์๋ ๊ฐ๋ฐ์ ๋ง์๋๋ก)
์ํ์ ์ด๋ ํ ๋ณํ๊ฐ ํ์ํ๊ฒ ๋ ๋, ์ก์
์ ๋ฐ์์ํจ๋ค. ๊ฐ์ฒด๋ก ํํ๋๋ค.
{
type: "ADD_TODO",
data: {
id: 0,
text: "๋ฆฌ๋์ค ๋ฐฐ์ฐ๊ธฐ"
}
}
์ก์
์ ๋ง๋๋ ํจ์์ด๋ค.
ํ๋ผ๋ฏธํฐ ๋ฐ์์์ ์ก์
๊ฐ์ฒด ํํ๋ก ๋ง๋ค์ด์ค๋ค.
export const addCart = (item) => { // ์ก์
"์์ฑ ํจ์"
return {
type: "ADD_ITEM", // ์ก์
"๊ฐ์ฒด"
payload: item,
};
};
๋ณดํต ํจ์ ์์ย export
ํค์๋๋ฅผ ๋ถ์ฌ์ ๋ค๋ฅธ ํ์ผ์์ ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ค.
Action ๊ฐ์ฒด๋ฅผ Reducer์ ๋ณด๋ด๋ ์ญํ ์ ํ๋ ํจ์์ด๋ค.
์คํ ์ด์ ๋ด์ฅํจ์ โ store.dispatch()
ํํ๋ก ์ ๊ณตํ๋ค.
๋ฐ๋์ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค.
๋ฆฌ๋์๋ ๋ณํ๋ฅผ ์ผ์ผํค๋ ํจ์๋ก ์ด์ ์ํฏ๊ฐ๊ณผ ์ก์
๊ฐ์ฒด๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ย ์๋ก์ด ์ํฏ๊ฐ์ ๋ง๋๋ ์์ ํจ์์ด๋ค. ์์ธก ๊ฐ๋ฅํด์ผ ํ๋ค.
๋ฆฌ๋์๋ ๋๊ฐ์ง์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์จ๋ค. (previousState, action) => newState
์ด๋ฐ ํํ์ด๋ค.
function reducer(state, action) {
// ์ํ ์
๋ฐ์ดํธ ๋ก์ง
return alteredState;
}
์ ๋ฆฌ, ํ์ฌ์ ์ํ์, ์ ๋ฌ ๋ฐ์ ์ก์ ์ ์ฐธ๊ณ ํ์ฌ ์๋ก์ด ์ํ๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ค.
store.getState()
๋ก ์ฝ์ด์ฌ ์ ์๋ค.const INITIAL_STATE = [];
// redux/cart.js
export default function cartReducer(state = INITIAL_STATE, action) {
// ์ธ์๋ก state, action
// state = INITIAL_STATE -> ์ฒซ๋ฒ์งธ ๊ฐ์ผ๋ก ์ธ์ ์๋ค์ด์ค๋ฉด INITIAL_STATE๋ฅผ ์ฐ๊ฒ ๋ค (useState() ์ด๊ธฐ๊ฐ๊ณผ ์ ์ฌ)
switch (action.type) {
// switch -> if ๋ฌธ์ด๋ ์ ์ฌ, ๊ฐ๋
ํ์คํ ๋ชฐ๋ผ๋ ๋จ
// action.type ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒ์ด๋ค.
case "ADD_ITEM": // action.type์ด "ADD_ITEM"์ด๋ฉด
return [...state, action.payload]; // ์ด์ ์ํ ๋ณต์ฌํ ๋ค์์ ์๋ก์ด item์ ์ถ๊ฐ
case "DELETE_ITEM": // action.type์ด "DELETE_ITEM"์ด๋ฉด
return state.filter((product) => product.id !== payload.id);
// ์ด์ state์ filter ๋ฉ์๋๋ก id ๋ ๋๊ฐ์ ๊ฒ๋ค ์ง์ด ๋ค ์๋ก ์ํ ์ ์ฅ
default: // ๊ธฐ๋ณธ๊ฐ ์ค์ -> ๋ง์ฝ์ action.type์ ๊ฑธ๋ฆฌ๋๊ฒ ์๋ฌด๊ฒ๋ ์์ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ
return state; // ํด๋น ์ฌํญ ์์ผ๋ฉด ์ด์ ์ํ๋ฅผ ๊ทธ๋๋ก ๋ฆฌํด
}
}
// redux/index.js
import { combineReducers } from "redux";
import cartReducer from "./cartReducer";
export default combineReducers({ cartReducer });
View
์์ ์ ์ ๊ฐ ์ผ์ผํค๋ ํ๋์ ๋ง๊ฒย Action
ย ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ,Dispatcher
๋ฅผ ํตํดย Reducer
๋ก ์ ๋ฌ๋๊ณ ,Store
๋ฅผ ๋ณ๊ฒฝํ๊ณ ,View
๋ก ๋ฐ์๋๋ ํจํด์ด๋ผ๊ณ ์์ฝํ ์ ์๋ค.