영원히 흘러가는 강

리덕스 장바구니 코드 뜯어보기 본문

리액트

리덕스 장바구니 코드 뜯어보기

double_R_one_G 2021. 6. 3. 17:55
728x90

 

Redux는 자바스크립트 앱을 위한 예측 가능한 상태 컨테이너입니다.

 

 

아무리 읽어봐도 어려운거 같다..

 

각설하고 코드부터 보는게 더 나을수도 있다는 생각에  장바구니 예제를 꼼꼼히 뜯어보자!

 

 

파일 구조 보기

더보기

src

   ㄴApp.js

   ㄴcomponents

                      ㄴCart

                              ㄴCart..js

                              ㄴCartItem

                                           ㄴCartItem.js

                       ㄴNavbar

                                   ㄴNavber.js

                        ㄴProducts

                                      ㄴProducts.js

                                      ㄴProduct

                                                   ㄴProduct.js

    ㄴredux

              ㄴstore.js

              ㄴrootReducer.js

              ㄴShopping

                             ㄴshopping-actions.js

                             ㄴshopping-reducers.js

                             ㄴshopping-types.js

 

 

 

components에 들어가 있는 부분을 제외하고!

 

우선 shopping-types.js

export const ADD_TO_CART = "ADD_TO_CART";
export const ADJUST_ITEM_QTY = "ADJUST_ITEM_QTY";
export const REMOVE_FROM_CART = "REMOVE_FROM_CART";
export const LOAD_CURRENT_ITEM = "LOAD_CURRENT_ITEM";

 

행동에 맞는 타입 지정

 

shopping-actions.js

import * as actionTypes from "./shopping-types";

export const addToCart = (itemID) => {
  return {
    type: actionTypes.ADD_TO_CART,
    payload: {
      id: itemID,
    },
  };
};

export const removeFromCart = (itemID) => {
  return {
    type: actionTypes.REMOVE_FROM_CART,
    payload: {
      id: itemID,
    },
  };
};

export const adjustItemQty = (itemID, qty) => {
  return {
    type: actionTypes.ADJUST_ITEM_QTY,
    payload: {
      id: itemID,
      qty,
    },
  };
};

export const loadCurrentItem = (item) => {
  return {
    type: actionTypes.LOAD_CURRENT_ITEM,
    payload: item,
  };
};

 

변화될 값 지정

 

 

shopping-reducers.js

 

실질적으로 변화를 만드는곳

 

import * as actionTypes from "./shopping-types";

const INITIAL_STATE = {
  products: [...  값 생략],
  cart: [],
  currentItem: null,
};

const shopReducer = (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case actionTypes.ADD_TO_CART:
      // Great Item data from products array
      const item = state.products.find(  			//선택한 물품
        (product) => product.id === action.payload.id
      );
      // Check if Item is in cart already
      const inCart = state.cart.find((item) =>		//카트에 해당물품 검색
        item.id === action.payload.id ? true : false
      );

      return {
        ...state,
        cart: inCart				//카트에 해당되는 물품 있다면
          ? state.cart.map((item) =>
              item.id === action.payload.id
                ? { ...item, qty: item.qty + 1 }	//해당물품 수량 +1
                : item
            )
          : [...state.cart, { ...item, qty: 1 }],	//없다면 카트에 새로추가
      };
    case actionTypes.REMOVE_FROM_CART:
      return {
        ...state,
        cart: state.cart.filter((item) => item.id !== action.payload.id),
      };			//필터 함수로 해당 물품 제외
    case actionTypes.ADJUST_ITEM_QTY:
      return {
        ...state,
        cart: state.cart.map((item) =>
          item.id === action.payload.id
            ? { ...item, qty: +action.payload.qty }	//수량 조정
            : item
        ),
      };
    case actionTypes.LOAD_CURRENT_ITEM:
      return {
        ...state,
        currentItem: action.payload,
      };
    default:
      return state;
  }
};

export default shopReducer;

 

 

728x90

'리액트' 카테고리의 다른 글

디즈니 클론(styled-components)  (0) 2021.06.25
react-redux (with. Hooks)  (0) 2021.06.09
Context api  (0) 2021.06.01
axios multi request (get 여러개)  (0) 2021.05.06
리액트 DOM 앨리먼트 innerHTML, dangerouslySetInnerHTML  (0) 2021.04.26
Comments