#4.0 Redux Toolkit
๋ฆฌ๋์ค ํดํท - ํจ์จ์ ์ผ๋ก ๋ฆฌ๋์ค ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์์ค
npm install @reduxjs/toolkit
#4.1 createAction
createAction ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ACTION ๋ถ๋ถ์ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๋ค.
ํจ์๋ฅผ ๋ง๋ค๊ณ , ๋ฌธ์์ด๋ก ์ ํํด์ฃผ๋ ์์
์์ด createAction์์ type๊ฐ์ ๋ถ์ฌํ๊ณ , ๋ถ์ฌ๋ฐ์ type๊ฐ์ reducer์์ ๋น๊ตํ๋ฉด์ action.payload๋ก ์ํ๋ ์์
์ ์งํํจ
ํ์คํ ์ด์ ์ฝ๋๋ณด๋ค ๊ฐ๊ฒฐํด์ก๊ณ ๊น๋ํด๋ณด์ธ๋ค.
(reducer ๋ด๋ถ์ ๋ฆฌํด์ ํจ์๋ก ์ ๋ฆฌํ๋ฉด ๋ ๊น๋ํด์ง๋ฏ?)
์ฝ๋
// store.js
import { combineReducers, createStore } from "redux";
import storage from "redux-persist/lib/storage";
import { persistReducer } from "redux-persist";
import { createAction } from "@reduxjs/toolkit";
const persistConfig = {
key: "todo", //localStorage์ ์ ์ฅ๋ key๊ฐ
storage: storage,
};
export const addToDo = createAction("ADD");
export const deleteToDo = createAction("DELETE");
const reducer = (state = [], action) => {
switch (action.type) {
case addToDo.type:
return [{ text: action.payload, id: state.length }, ...state];
case deleteToDo.type:
return state.filter((toDo) => toDo.id !== action.payload);
default:
return state;
}
};
const allReducer = combineReducers({
reducer,
});
const store = createStore(persistReducer(persistConfig, allReducer));
export default store;
#4.2 createReducer
createReducer ๋ฉ์๋๋ฅผ ์ฌ์ฉ, reducer ๋ด์ฉ์ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๋ค.
Can use state mutate ! toolkit์ด Immer ์๋์ ์๋ํ๊ธฐ์ state๋ฅผ ์์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์๋ก์ด state๋ฅผ ์ฌ์ฉํ ๋๋ return์ผ๋ก, ๊ธฐ์กด์ state ์์ ์ mutate๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฝ๋
// store.js
import { combineReducers, createStore } from "redux";
import storage from "redux-persist/lib/storage";
import { persistReducer } from "redux-persist";
import { createAction, createReducer } from "@reduxjs/toolkit";
const persistConfig = {
key: "todo", //localStorage์ ์ ์ฅ๋ key๊ฐ
storage: storage,
};
export const addToDo = createAction("ADD");
export const deleteToDo = createAction("DELETE");
const reducer = createReducer([], {
[addToDo]: (state, action) => {
state.unshift({text:action.payload, id: state.length})
},
[deleteToDo]: (state, action) =>
state.filter((toDo)=> toDo.id !== action.payload)
})
const allReducer = combineReducers({
reducer,
});
const store = createStore(persistReducer(persistConfig, allReducer));
export default store;
#4.3 configureStore
configureStore ๋ฉ์๋๋ฅผ ์ฌ์ฉ, createStore ๊ธฐ๋ฅ์ ๋์ ํ๋ค.
reducer๋ฅผ ๊ฐ์ฒด ํ์์ผ๋ก ์ ๋ฌํด ๋ง๋ค ์ ์๋ค.
ํฌ๋กฌ ํ์ฅ ํ๋ก๊ทธ๋จ์ธ Redux DevTools
(๋ก์ปฌ ์คํ ๋ฆฌ์ง ์ฉ์ผ๋ก ์์ฑํ ์ฝ๋๋๋ฌธ์ ์ด๋ป๊ฒ ์์ ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค)
์ฐธ๊ณ ์ฐธ๊ณ 2
#4.4 createSlice
createSlice ๋ฉ์๋๋ฅผ ์ด์ฉํด, reducer์ action์ ์๋์ผ๋ก ์์ฑํ๋ค.
์ฝ๋
// store.js
import { combineReducers, createStore } from "redux";
import storage from "redux-persist/lib/storage";
import { persistReducer } from "redux-persist";
import { createAction, createReducer } from "@reduxjs/toolkit";
const persistConfig = {
key: "todo", //localStorage์ ์ ์ฅ๋ key๊ฐ
storage: storage,
};
export const addToDo = createAction("ADD");
export const deleteToDo = createAction("DELETE");
const reducer = createReducer([], {
[addToDo]: (state, action) => {
state.unshift({text:action.payload, id: state.length})
},
[deleteToDo]: (state, action) =>
state.filter((toDo)=> toDo.id !== action.payload)
})
const allReducer = combineReducers({
reducer,
});
const store = createStore(persistReducer(persistConfig, allReducer));
export default store;
#4.5 Conclusions
#3๊ณผ #4์ ๊ฐ์ ๊ธฐ๋ฅ์ ์๋ํ๋ค.
ํ์ง๋ง #4์ ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ก๋ค.
Recux toolkit์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ค.
๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ์๋ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์๋๋ฐ ์ด๋ ต๋คโฆ
์ฝ๋
// store.js
import { configureStore, createSlice } from "@reduxjs/toolkit";
const toDos = createSlice({
name: 'toDosReducer',
initialState: [],
reducers: {
add: (state, action) => {
state.unshift({text:action.payload, id: Date.now()})},
remove: (state, action) => state.filter(toDo=> toDo.id !== action.payload)
}
})
export const {add, remove} = toDos.actions;
export default configureStore({ reducer: toDos.reducer});