ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React]Cmarket Redux
    codeStates front-end/React 2023. 2. 27. 16:29
    반응형

    목차

       

       

       

      📌 My Agora states server

       

       

      📖 학습 목표

       

      pass한 순서대로 문제 해결

       

       

       

      Action 생성

       

      actions - index.js

       

      // action types
      export const ADD_TO_CART = "ADD_TO_CART";
      export const REMOVE_FROM_CART = "REMOVE_FROM_CART";
      export const SET_QUANTITY = "SET_QUANTITY";
      export const NOTIFY = "NOTIFY";
      export const ENQUEUE_NOTIFICATION = "ENQUEUE_NOTIFICATION";
      export const DEQUEUE_NOTIFICATION = "DEQUEUE_NOTIFICATION";
      
      // actions creator functions
      export const addToCart = (itemId) => {
        return {
          type: ADD_TO_CART,
          payload: {
            quantity: 1,
            itemId
          }
        }
      }
      
      export const removeFromCart = (itemId) => {
        return {
          type: REMOVE_FROM_CART,
          payload: {
            itemId
          }
        }
      }
      
      export const setQuantity = (itemId, quantity) => {
        return {
          type: SET_QUANTITY,
          payload: {
            quantity,
            itemId
          }
        }
      }
      
      export const notify = (message, dismissTime = 5000) => dispatch => {
        const uuid = Math.random()
        dispatch(enqueueNotification(message, dismissTime, uuid))
        setTimeout(() => {
          dispatch(dequeueNotification())
        }, dismissTime)
      }
      
      export const enqueueNotification = (message, dismissTime, uuid) => {
        return {
          type: ENQUEUE_NOTIFICATION,
          payload: {
            message,
            dismissTime,
            uuid
          }
        }
      }
      
      export const dequeueNotification = () => {
        return {
          type: DEQUEUE_NOTIFICATION
        }
      }

       

       

      Reducer 생성

       

      reducers - itemReducer.js

       

      import { REMOVE_FROM_CART, ADD_TO_CART, SET_QUANTITY } from "../actions/index";
      import { initialState } from "./initialState";
      
      const itemReducer = (state = initialState, action) => {
      
        switch (action.type) {
          case ADD_TO_CART:
            //TODO
            return Object.assign({}, state, {
              cartItems: [...state.cartItems, action.payload]
            })
      
            break;
          case REMOVE_FROM_CART:
            //TODO
            let currentItem = state.cartItems.filter((el) => el.itemId !== action.payload.itemId)
            return Object.assign({}, state, {
              cartItems: currentItem
            })
      
            break;
            case SET_QUANTITY:
              let idx = state.cartItems.findIndex(el => el.itemId === action.payload.itemId)
              return {
                ...state,
                cartItems: [...state.cartItems.slice(0, idx), action.payload, ...state.cartItems.slice(idx + 1)]
              }
            break;
          default:
            return state;
        }
      }
      
      export default itemReducer;

       

       

      dispatch 생성

       

      pages - itemListContainer.js

       

      import React from 'react';
      import { addToCart, notify } from '../actions/index';
      import { useSelector, useDispatch } from 'react-redux';
      import Item from '../components/Item';
      
      function ItemListContainer() {
        const state = useSelector(state => state.itemReducer);
        const { items, cartItems } = state;
        const dispatch = useDispatch();
      
        const handleClick = (item) => {
          if (!cartItems.map((el) => el.itemId).includes(item.id)) {
            //TODO: dispatch 함수를 호출하여 아이템 추가에 대한 액션을 전달하세요.
            dispatch(addToCart(item.id))
            dispatch(notify(`장바구니에 ${item.name}이(가) 추가되었습니다.`))
          }
          else {
            dispatch(notify('이미 추가된 상품입니다.'))
          }
        }
      
        return (
          <div id="item-list-container">
            <div id="item-list-body">
              <div id="item-list-title">쓸모없는 선물 모음</div>
              {items.map((item, idx) => <Item item={item} key={idx} handleClick={() => {
                handleClick(item)
              }} />)}
            </div>
          </div>
        );
      }
      
      
      
      export default ItemListContainer;

       

      pages - ShoppingCart.js

       

      ...
        const handleQuantityChange = (quantity, itemId) => {
          //TODO: dispatch 함수를 호출하여 액션을 전달하세요.
          dispatch(setQuantity(itemId,quantity))
        }
      
        const handleDelete = (itemId) => {
          setCheckedItems(checkedItems.filter((el) => el !== itemId))
          dispatch(removeFromCart(itemId))
          //TODO: dispatch 함수를 호출하여 액션을 전달하세요.
          dispatch(removeFromCart(itemId))
        }
        ...

       

      반응형

      'codeStates front-end > React' 카테고리의 다른 글

      [React] Virtual DOM, React Diffing Algorithm  (0) 2023.03.22
      [React] 번들링과 웹팩  (0) 2023.03.20
      [React] Redux  (0) 2023.02.24
      [React] Storybook, useRef  (0) 2023.02.20
      [React] custom component/ Styled-Component  (0) 2023.02.20

      댓글

    Designed by Tistory.