티스토리 뷰

웹개발(프론트)/React

Redux Toolkit

수달찌 2021. 4. 15. 23:09

목차

     

     

    드디어 마지막 Redux Toolkit이다아아

    Redux Toolkit

    Redux Toolkit은

    Redux를 좀 더 간편하게 만들 수 있는 도구이다.

    으음.. react로 비유하자면 hook 같은 느낌!

    life Cycle을 이해하고 쓴다면 코드를 엄청 줄일 수 있는 강력한 도구!

    설치

    일단 터미널을 통하여 

    npx create-react-app my-app --template redux

    터미널에 해당 명령어를 입력하여

    redux를 포함한 react 프로젝트를 생성한다.

    npm install @reduxjs/toolkit

    이번에는 toolkit두 설치해주자!

    코드

    이번 코드는 바로 전 Redux-react에서의 코드를

    toolkit으로 얼마나 효율적으로 바꿀 수 있는지가 핵심임으로

    저번 코드에서 가져와서 할 거다

     

    Redux by react

    목차 당신에게 Redux는 필요 없을지도 모릅니다. 이 글은 Dan Abramov의 You Might Not Need Redux를 번역한 글입니다. medium.com Redux 공식 홈페이지에 올라와 있는 글 중 하나이다. 구글링을 하면서 리덕스에.

    sirong.tistory.com

    안 보고 왔으면 보고 오자.

    redux를 이해하지 않고 toolkit을 사용하는 것은 위험하다

    before

    //Store.js
    
    import { createStore } from "redux";
    
    const PLUS = "PLUS";
    const MINUS = "MINUS";
    
    const actionPlusOne = (number) => {
      return {
        type: PLUS,
        number
      };
    };
    
    const actionMinusOne = (number) => {
      return {
        type: MINUS,
        number
      };
    };
    
    function Store (number = 0, action) {
      switch(action.type){
        case PLUS:
          return number +1;
        case MINUS:
          return number -1;
        default:
          return number;
      }
    }
    
    const countStore = createStore(Store);
    
    export default Store;
    
    export const actions = {
      actionPlusOne,
      actionMinusOne
    };

    after

    //Store.js
    
    import { createStore } from "redux";
    import { createAction, createReducer } from "@reduxjs/toolkit";
    
    const actionPlusOne = createAction("PLUS");
    const actionMinusOne = createAction("MINUS");
    
    const Store = createReducer(0, {
      [actionPlusOne]: (state, action) => {
        return action.payload+1;
      },
      [actionMinusOne]: (state, action) => {
        return action.payload-1;
      },
    })
    
    const countStore = createStore(Store);
    
    export const actions = {
      actionPlusOne,
      actionMinusOne
    };
    
    export default countStore;

    해석

    redux Toolkit을 쓴 부분은 

    createAction

    import { createStore } from "redux";
    import { createAction } from "@reduxjs/toolkit";
    
    const actionPlusOne = createAction("PLUS");
    const actionMinusOne = createAction("MINUS");
    // const PLUS = "PLUS";
    // const MINUS = "MINUS";
    
    // const actionPlusOne = (number) => {
    //   return {
    //     type: PLUS,
    //     number
    //   };
    // };
    
    // const actionMinusOne = (number) => {
    //   return {
    //     type: MINUS,
    //     number
    //   };
    // };
    
    const Store = (number = 0, action) => {
      switch(action.type){
        case actionPlusOne.type:
        // case PLUS:
          return action.payload +1;
          // return action.number +1;
        case actionMinusOne.type:
        // case MINUS:
          return action.payload -1;
          // return action.number -1;
        default:
          return number;
      }
    };
    
    const countStore = createStore(Store);
    
    
    export const actions = {
      actionPlusOne,
      actionMinusOne
    };
    
    export default countStore;

    createAction은 말 그대로

    Redux 저장소에서 action을 만들어주는 함수이다.

    예로 들어

    const PLUS = "PLUS";
    
    const actionPlusOne = (number) => {
      return {
        type: PLUS,
        number
      };
    };

    action을 정의하기 위해, 이렇게 코드를 짜야했던걸

    const actionPlusOne = createAction("PLUS");

    이렇게 한 줄로 줄일 수 있다.

     

    이에 따라, 저장소에서 변경을 좀 줘야 하는데

    const Store = (number = 0, action) => {
      switch(action.type){
        case PLUS:
          return action.number +1;
        case MINUS:
          return action.number -1;
        default:
          return number;
      }
    };

    해당 저장소를

    const Store = (number = 0, action) => {
      switch(action.type){
        case actionPlusOne.type:
          return action.payload +1;
        case actionMinusOne.type:
          return action.payload -1;
        default:
          return number;
      }
    };

    createAction를 담은 변수의 type를 switch.case로 담고

    number로 명시하여 받아왔던 데이터

    playload로 통일되어 가져와진다.

    데이터가 여러 개일 경우,

    payload: {
      number: 3,
      state: 'OK'
    }

    이렇게 payload라는 object안에 묶인다.

    createReducer

    import { createStore } from "redux";
    import { createAction, createReducer } from "@reduxjs/toolkit";
    
    const actionPlusOne = createAction("PLUS");
    const actionMinusOne = createAction("MINUS");
    
    // const Store = (number = 0, action) => {
    //   switch(action.type){
    //     case actionPlusOne.type:
    //     // case PLUS:
    //       return action.payload +1;
    //       // return action.number +1;
    //     case actionMinusOne.type:
    //     // case MINUS:
    //       return action.payload -1;
    //       // return action.number -1;
    //     default:
    //       return number;
    //   }
    // };
    
    const Store = createReducer(0, {
      [actionPlusOne]: (state, action) => {
        return action.payload+1;
      },
      [actionMinusOne]: (state, action) => {
        return action.payload-1;
      },
    })
    
    const countStore = createStore(Store);
    
    
    export const actions = {
      actionPlusOne,
      actionMinusOne
    };
    
    export default countStore;

    createReducer은 reducer Store를

    더 깔끔하게 만들어주는 함수이다.

    const Store = (number = 0, action) => {
      switch(action.type){
        case actionPlusOne.type:
          return action.payload +1;
        case actionMinusOne.type:
          return action.payload -1;
        default:
          return number;
      }
    };

    이 부분을

    const Store = createReducer(0, {
      [actionPlusOne]: (state, action) => { return action.payload+1;},
      [actionMinusOne]: (state, action) => { return action.payload-1;},
    })

    이렇게 대체할 수 있다.

    일단 장점으로써, switch를 안 써도 된다는 것,

     

    또한 추후에 다른 포스팅으로 안내할 것인데,

    Redux는 data를 변경했을 때,

    존재하던 데이터를 변경하는 게 아니라

    새로운 데이터를 정의하여 반환한다.

    이는 hook도 같다.

     

    즉 예로 들어 배열 같은 경우 배열을 한 칸 추가할 때

    push함수를 쓰면 에러가 뜬다.

    하지만 createReducer에서는 push함수를 사용할 수 있다.

    존재하던 데이터에서 수정하는 방식으로 사용 가능하단 것이다.

     

    이는 지금 다루기엔 예제가 복잡해질까 봐 나눠서 설명하려 하는데,

    일단 그러한 단순히 switch 문을 안 써도 되는 것에 끝나는 게 아니라,

    그보다 더 중점인 장점도 있다는 것이다.

    으으음... 

    생각보다 양이 많은 것 같다. 왜지

    일단 여기서 끊어야겠다.

    더 적어봤자 읽는 사람도 효율이 떨어질 것 같다.

    '웹개발(프론트) > React' 카테고리의 다른 글

    createElement 스타일 변경  (0) 2021.04.18
    styled components 심화편  (0) 2021.04.17
    Redux by react  (0) 2021.04.14
    Redux  (0) 2021.04.12
    useMemo  (0) 2021.04.04
    댓글
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2025/02   »
    1
    2 3 4 5 6 7 8
    9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28
    글 보관함