-
[React]Cmarket ReduxcodeStates 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