[React.js] Redux (3)


๐Ÿš€ย redux-toolkit๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹๊ณ  ํ˜„๋Œ€์ ์ธ ๋ฐฉ๋ฒ•

  • Redux-toolkit์€ redux ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋งค์šฐ ์œ ๋ช…ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ Redux์—์„œ ๊ณต์‹์ ์œผ๋กœ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • Redux-toolkit์—๋Š” store, createAction, createReducer ๋ฐ createSlice๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • configureStore ๋ฉ”์†Œ๋“œ๋Š” redux ์Šคํ† ์–ด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ redux-devTools๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.ย ๋”ฐ๋ผ์„œ devtoolsEnhancer ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ payload ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” createAction ๋ฉ”์„œ๋“œ๋ฅผ ๋ด…๋‹ˆ๋‹ค.
import { createAction } from '@reduxjs/toolkit';

const addTask = createAction('ADD_TASK');
console.log(addTask({ task: 'Add new task!' }));

//Output in console
{ type: 'ADD_TASK', payload: { task: 'Add new task!' } }
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ switch case ๋˜๋Š” If..else๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” createReducer ํ•จ์ˆ˜.
  • ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์—๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์—์„œ ์•ก์…˜๊ณผ ๋ฆฌ๋“€์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” createSlice ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.ย ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๊นจ๋—ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•จ.
import { createSlice } from "@reduxjs/toolkit";
let id = 0;

const taskSlice = createSlice({
  name: "tasks",
  initialState: [],
  reducers: {
    // action: function
    addTask: (state, action) => {
      state.push({
        id: ++id,
        task: action.payload.task,
        completed: false,
      });
    },
    removeTask: (state, action) => {
      const index = state.findIndex((task) => task.id === action.payload.id);
      state.splice(index, 1);
    },
    completedTask: (state, action) => {
      const index = state.findIndex((task) => task.id === action.payload.id);
      state[index].completed = true;
    },
  },
});

export const { addTask, removeTask, completedTask } = taskSlice.actions;
export default taskSlice.reducer;
  • redux-toolkit์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋ฆฌ๋“€์„œ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Œ.
import { configureStore } from "@reduxjs/toolkit";
import employeeReducer from "./employees";
import taskReducer from "./tasks";

const store = configureStore({
  reducer: {
    tasks: taskReducer,
    employees: employeeReducer,
  },
});

export default store;