• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 React 게시판 cart 페이지 수량 증감 기능 관련하여 질문드립니다

cart 페이지 수량 증감 기능 관련하여 질문드립니다

4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 글쓴이
  • #11330

    breadlee
    참가자

    안녕하세요 선생님!

    cart 페이지 수량증감 기능 관련하여 에러발생 및 의문점이 들어서 질문드립니다.

     

    cart.js페이지의 코드는 간략히 아래와 같습니다 (index.js 페이지에 state를 저장해서 불러오는 방식을 사용했습니다)

     

    const Cart = (props) => {

      return (
            <div className="cart">
                <Table>
                    <thead>
                        <tr>
                            <th>index</th>
                            <th>상품명</th>
                            <th>수량</th>
                            <th>변경</th>
                        </tr>
                    </thead>
                    <tbody>
                    {
                        props.cartState.map((a, i) => {
                            return (
                                <tr key={i}>
                                    <td> { props.cartState[i].id }</td>
                                    <td> { props.cartState[i].title} </td>
                                    <td> { props.cartState[i].quan } </td>
                                    <td>
                                        <button class="btn" onClick={() => {
                                            props.dispatch({ type: 'plus', payload: props.cartState.id })
                                        }}>+</button>
                                        <button class="minusBtn btn" onClick={() => {
                                            props.dispatch({ type: 'substract', payload: props.cartState.id })
                                        }}>-</button>
                                    </td>
                                </tr>
                            )
                        })
                    }
                   
                    </tbody>
                </Table>

            </div>
        );
    };

    function shoeProps(state) {
        return {
            state: state.reducer,
            lestState: state.reducer2,
            cartState: state.reducer3
        }
    }
    export default connect(shoeProps)(Cart); 

     

     

    state값을 index.js 파일에 cartState라는 값으로 불러왔고, 그 외는 강의와 똑같이 구성해보았습니다!

     

    아래는 index.js 파일에서 수량증감과 관련된 리듀서 부분입니다

     

    let cartState = [];

     

    // cart 데이터
    function reducer3(state = cartState, action) {
      // 주문하기 누르면 cart에 항목 추가
      if (action.type === 'cartAdd') {
        let found = state.findIndex((a) => { return a.id === action.payload.id })
        
        if (found >= 0) {
          let setCart = [...state];
          //setCart[found] = action.payload;
          setCart[found].quan++;
          return setCart;
        }
        else{
          let setCart =[...state];
          setCart.push(action.payload)
          return setCart;
        }
      }

      // cart에 수량증감 ---------------------------수량증감 관련된 action과  payload가 정의된 부분입니다!
      else if (action.type === 'plus') {
        let setCart = [...state];
        console.log(setCart)      << 상품을 추가할 때마다, 콘솔을 찍어보면 [ {id:1, title:"Red Knit", quan:1}, {id:0, title:"White&black", quan:1}, ... ] 와 같이 정상적으로 배열이 추가됩니다
        
        setCart[action.payload].quan++;
        console.log(setCart)
        return setCart
      }

      else if (action.type === 'substract') {
        let setCart = [...state]
        
        if (setCart[action.payload].quan > 0) {  
          setCart[action.payload].quan--;
          return setCart
        }
        else {
          return 0
        }
        
      }

      else {
        return state
      }
    }

     

     

    위와 같은 코드로 실행했을 때, 오류메시지가 뜨는 부분은 아래와 같습니다

    TypeError: Cannot read property 'quan' of undefined

     

    위의 오류를  이해하기 위해 여러 시도를 하다가 문득 의문점이 들어서 질문드립니다!

     

    제가 id가 3인 상품을 장바구니에 담고, 그 이후 id가 0인 상품을 장바구니에 추가했다면

    장바구니에는 담기는 순서가 (id가 3인 상품 > id가 0인 상품) 순으로 담깁니다

    여기서 첫 번째 상품(id가 3인 상품)의 수량증가버튼(+)을 클릭하면,

    index.js에 정의되어있는 action.type === "plus" 에 의하면 아래처럼 해석해서 생각이 됩니다

     

    else if (action.type === 'plus') {        // id가 3인 상품의 "플러스" 버튼을 누릅니다
        let setCart = [...state];                     // cartState는 빈배열이나, 플러스 버튼을 통해 id가 3인 상품의 객체가 담깁니다
        console.log(setCart)                        // 콘솔로 확인해보면 [{id: 3, title: "상품명" , quan: 1}]
        
        setCart[action.payload].quan++;    // 에러가 발생한 부분
        console.log(setCart)
        return setCart
      }

     

    에러가 발생한 이유가, 

    setCart[action.payload].quan++;  부분에 실질적으로 들어오는 값이

    setCart[3].quan++;  가 되면

    장바구니 리스트에서는 첫 번째[0] 상품의 수량증감을 설정하는데 id가 3인 상품을 setCart에 넣으면

    setCart[3].quan++; 가 되어버려서 오류가 나는 것이 아닐까 하는 추측을 했습니다

     

    제가 잘못된 방향으로 접근하고 있는 것 같기도 하고, 오류에 대한 해결 방안도 찾지 못하여 질문드립니다!

     

    #11332

    codingapple
    키 마스터

     

    아마 지금 수량증가/감소 기능은 id가 2인 상품의 +/- 버튼을 누르면

    state에서 2번째 들어있는 상품을 수정하라고 간단히 개발해놔서 그렇습니다 

    2번째 말고 id가 2인 상품을 수정하라고 개발해놓으면 되겠군요 

    #11351

    breadlee
    참가자

    감사합니다 선생님 

    해결했습니다 🙂 ~~!!

    #11353

    codingapple
    키 마스터

    천재ㄷㄷ

4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠