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가지를 한번에 해결할 수 있다.

  1. export action value
  2. export reducer
  3. 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 세가지 기능을 한번에 갖는다!