What I Learnd/TIL
TIL - Redux-ToolKit 리덕스 툴킷이란?
키싸
2023. 7. 4. 20:51
Redux-Toolkit
→ 기존 리덕스를 좀 더 쉽게 사용하기 위해 만든 툴로, 스토어를 구성하는 방식과 액션크리에이터, 리듀서 작성 방식이 간편해진다.
1. Redux-toolkit 설치
yarn add react-redux @reduxjs/toolkit
2. configStore.js
: 카운터 만들기를 통해 기존 일반 리듀서를 사용할 때와 툴킷을 사용할 때의 차이를 확인해보자
//ASIS : 일반 리듀서
const rootReducer = combineReducers({
counter: counter,
})
const store = createStore(rootReducer)
// TODO : Reduxt Toolkit
const store = configureStore({
reducer: {
counter: counter,
}
})
3. todo.js
[slice] API를 사용하면 기존에 만들어줬던 아래 3가지를 한번에 해결할 수 있다.
- export action value
- export reducer
- action value
// 기존 일반 리덕스 사용한 modules/js 코드
import React from "react";
import { v4 as uuidv4 } from "uuid";
// action items
const ADD_TODO = "ADD_TODO";
const REMOVE_TODO = "REMOVE_TODO";
const SWITCH_TODO = "SWITCH_TODO";
export const addTodo = (payload) => {
return {
type: ADD_TODO,
payload,
};
};
export const removeTodo = (payload) => {
return {
type: REMOVE_TODO,
payload,
};
};
export const switchTodo = (payload) => {
return {
type: SWITCH_TODO,
payload,
};
};
// initial states
const initialState = [
{
id: uuidv4(),
title: "리액트 공부하기",
contents: "빨리빨리 암기하기",
isDone: false,
},
{
id: uuidv4(),
title: "스프링 공부하기",
contents: "인강 열심히 들어보기!!",
isDone: true,
},
{
id: uuidv4(),
title: "데이트",
contents: "홍대입구역에서 3시까지",
isDone: false,
},
];
// reducers
const todos = (state = initialState, action) => {
switch (action.type) {
case ADD_TODO: // 기존의 배열에 입력받은 객체를 더함
return [...state, action.payload];
case REMOVE_TODO: // 기존의 배열에서 입력받은 id의 객체를 제거(filter)
return state.filter((item) => item.id !== action.payload);
case SWITCH_TODO: // 기존의 배열에서 입력받은 id에 해당하는 것만 isDone을 반대로 변경(아니면 그대로 반환)
return state.map((item) => {
if (item.id === action.payload) {
return { ...item, isDone: !item.isDone };
} else {
return item;
}
});
default:
return state;
}
};
// export
export default todos;
// 리덕스 툴킷을 사용해 간결해진 코드
import { createSlice } from "@reduxjs/toolkit";
import React from "react";
import { v4 as uuidv4 } from "uuid";
// initial states
const initialState = [
{
id: uuidv4(),
title: "리액트 공부하기",
contents: "빨리빨리 암기하기",
isDone: false,
},
{
id: uuidv4(),
title: "스프링 공부하기",
contents: "인강 열심히 들어보기!!",
isDone: true,
},
{
id: uuidv4(),
title: "데이트",
contents: "홍대입구역에서 3시까지",
isDone: false,
},
];
const todosSlice = createSlice({
name: "todos",
initialState,
reducers: {
addTodo: (state, action) => {
return [...state, action.payload];
},
removeTodo: (state, action) => {
return state.filter((item) => item.id !== action.payload);
},
switchTodo: (state, action) => {
return state.map((item) => {
if (item.id === action.payload) {
return { ...item, isDone: !item.isDone };
} else {
return item;
}
});
},
},
});
export const { addTodo, removeTodo, switchTodo } = todosSlice.actions;
export default todosSlice.reducer;
// slice API는 action value, action creator, reducer 세가지 기능을 한번에 갖는다!