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' 카테고리의 다른 글

    댓글

Designed by Tistory.