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

home2 게시판 React 게시판 0번 상품이 없을 경우 cart에서 수량증가가 되지 않는 문제

0번 상품이 없을 경우 cart에서 수량증가가 되지 않는 문제

  • 이 주제에는 6개 답변, 2명 참여가 있으며 codingapple4 년 전에 전에 마지막으로 업데이트했습니다.
7 글 보임 - 1 에서 7 까지 (총 7 중에서)
  • 글쓴이
  • #10428

    kimjs
    참가자

    안녕하세요

     

    아래의 두번째 Red Knit 상품을 선택한 후 

    주문하기 버튼을 클릭하면

    아래와 같이 상품이 잘 추가가 됩니다.

    하지만 수량증가 버튼을 클릭하면 아래와 같이 에러가 발생합니다.

    첫 번째 상품이 카트에 있을때는 수량증가,감소가 잘 동작하는데, 첫 번째 상품이 없을 경우 에러가 발생합니다.

    어떤 부분을 수정하면 정상적으로 동작할까요

     
    <ul>
    <li>작성된 코드 입니다.</li>
    </ul>
    Detail.js입니다.

    =================================================

    import React, {useEffect, useState} from 'react'
    import { useHistory, useParams } from 'react-router-dom'
    import styled from 'styled-components'
    import { Navbar,Container,Nav,NavDropdown,Jumbotron,Button, Card } from 'react-bootstrap';

    import { CSSTransition } from "react-transition-group"
    import './Detail.scss'
    import { connect } from 'react-redux';

    let 박스 = styled.div'
        padding: 20px;
    ';
    let 제목 = styled.h4'

        font-size: 25px;
        color: ${ props => props.색상 }
    ';  
     

    function Detail(props) {
     
        let [Alert,ChangeAlert] = useState(true) 
        let [inputData,ChangeInputdata] = useState('')
        let { id } = useParams()
        let history = useHistory();
        let selectshoes = props.shoes.find(function(product){
            return product.id == id
        })
        let [tab, ChangeTab] = useState(0)
        let [스위치, 스위치변경] = useState(false)
        
        useEffect(()=>{
            let delAlert = setTimeout(()=>{
                ChangeAlert( false )
            }, 2000) 
            return ()=>{ clearTimeout(delAlert) }
        },[]);
     
        return (
            <div className="container">
                <박스>
                    <제목>상세페이지</제목>
                </박스>
                
                {
                    Alert === true
                    ? (<div className="my-alert2">
                        <p>재고가 얼마 남지 않았습니다.</p>
                      </div>)
                    : null 
                }

                <div className="row">
                    <div className="col-md-6">
                <img src={'https://codingapple1.github.io/shop/shoes' + (selectshoes.id + 1) + '.jpg'} width="100%" />           
                </div>
                <div className="col-md-6 mt-4">
                    <h4 className="pt-5">{selectshoes.title}</h4>
                    <p>{selectshoes.content}</p>
                    <p>{selectshoes.price}원</p>
                    <Info stock={props.stock}/>
                    <button className="btn btn-danger" onClick={()=>{
                        props.ChangeStock([9,11,12])
                        props.dispatch({type:'항목추가', 
                        데이터: {id:selectshoes.id, name:selectshoes.title, quan:1}})
                        history.push('/cart')
                    }}>주문하기</button>
                    <button className="btn btn-danger" onClick={()=>{
                        history.push('/');
                    }}>취소</button> 
                </div>
                </div>

                <Nav className="mt5" variant="tabs" defaultActiveKey="link-0">
                <Nav.Item>
                    <Nav.Link eventKey="link-0" onClick={()=>{
                        스위치변경(false); ChangeTab(0)
                    }}>상품설명</Nav.Link>
                </Nav.Item>
                <Nav.Item>
                    <Nav.Link eventKey="link-1" onClick={()=>{
                        스위치변경(false); ChangeTab(1)
                    }}>배송정보</Nav.Link>
                    
                </Nav.Item>
                </Nav>

                <CSSTransition in={스위치} classNames="wow" timeout={500} >
                <TabContent tab={tab} 스위치변경={스위치변경} />
                </CSSTransition>

            </div> 
        )
    }

    function TabContent(props) {

        useEffect(()=>{
            props.스위치변경(true)
        })

        if (props.tab === 0) {
            return <div>전품목 20% 세일</div>
        } else if (props.tab === 1) {
            return <div>당일배송</div>
        } else if (props.tab === 2) {
            return <div>2번째 내용입니다.</div>
        }
    }

    function shoeCard(props) {
        
    }

    function Info(props) {
        return (
            <p>재고: {props.stock[0]}</p>
        )
    }

    function 함수명(state) {
        return {
            state : state.reducer,
            alertOpen : state.reducer2
        }
    }

    export default connect(함수명)(Detail)

    =================================================

    Cart.js 입니다.

    =================================================

    import React from 'react';
    import {Table} from 'react-bootstrap'
    import { connect } from 'react-redux';

    function Cart(props) {
        return (
            <div>
                <Table responsive="sm">
                    <thead>
                    <tr>
                        <th>#</th>
                        <th>상품명</th>
                        <th>수량</th>
                        <th>변경</th>
                    </tr>
                    </thead>
                    <tbody>
                        {
                            props.state.map((a,i)=> {
                                return (
                                    <tr key={i}>
                                        <td>{a.id}</td>
                                        <td>{a.name}</td>
                                        <td>{a.quan}</td>
                                        <td>
                                        <button onClick={()=>{props.dispatch( {type :'수량증가', 데이터 : a.id} )}}>+</button>
                                        <button onClick={()=>{props.dispatch( {type :'수량감소', 데이터 : a.id} )}}>-</button>
                                        </td>
                                    </tr>
                                )
                            })
                        }
                    </tbody>
                </Table>
                { 
                props.alertOpen === true
                ? (<div className="my-alert2">
                    <p>지금 구매하시면 신규할인 20%</p>
                    <button onClick={()=>{props.dispatch( {type :'alert닫기'} )}}>닫기</button>
                    </div>)  
                : null
                    
                }
            </div>
        )
    }

    function 함수명(state) {
        return {
            state : state.reducer,
            alertOpen : state.reducer2
        }
    }

    export default connect(함수명)(Cart)

    =================================================

    index.js 입니다.

    =================================================

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import reportWebVitals from './reportWebVitals';
    import { HashRouter } from 'react-router-dom';
    import { Provider } from 'react-redux';
    import { combineReducers, createStore } from 'redux';

    let 기본state = []

    let alert초기값 = true;

    function reducer2(state = alert초기값, 액션) {
      if (액션.type==='alert닫기'){
        
        state = false;
        return state;
      } else {
      return state
    }
    }

    function reducer(state = 기본state, 액션){
    if( 액션.type === '항목추가'){

      let found = state.findIndex((a)=>{ return a.id === 액션.데이터.id })

      if (found >= 0 ){
        let copy = [...state]
        copy[found].quan++
        return copy
      } else {
        let copy = [...state]
        copy.push(액션.데이터);
        return copy
      }
    } else if ( 액션.type === '수량증가'){

        let copy = [...state]
        copy[액션.데이터].quan++;
        return copy

      } else if (액션.type === '수량감소'){
        let copy = [...state]
        copy[액션.데이터].quan--;
        return copy

      } else {
        return state
      }
    }

    let store = createStore(combineReducers({reducer,reducer2}));

    ReactDOM.render(
      <React.StrictMode>
        <HashRouter>
          <Provider store={store}>
            <App />
          </Provider>
        </HashRouter>
      </React.StrictMode>,
      document.getElementById('root')
    );

    =================================================

     

     

     

     

     

    #10435

    codingapple
    키 마스터

    아마도 지금 수량증가/감소 기능은

    id가 1인 상품의 +/- 버튼을 누르면

    copy[1].quan++; 이렇게 장바구니 state에서 1번째 들어있는 상품을 수정하라고 간단히 개발해놔서 그렇습니다 

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

    #10443

    kimjs
    참가자

    강의에서 알려주신 것 처럼 [액션.데이터].quan++ 을 사용하여 작성하였습니다.

    0번째 상품을 장바구니에 옮겨놓으면 모든 것이 정상대로 동작합니다.

    하지만 0번째 상품이 없으면 에러가 납니다.

    #10445

    kimjs
    참가자

    https://todaykimjs.github.io/

    사이트주소입니다.

    #10451

    codingapple
    키 마스터

    강의에서 작성한게 완벽한 코드인지 의심해봐야할 시간입니다 

    0번상품만 잘되는 이유는

    지금 장바구니에 상품이 0번 2번이 저장되어있다고 합시다

    그럼 장바구니 state가 [0번상품, 2번상품] 대충 이렇게 생겼겠군요 

     

    이제 실험해보면 

    id가 0인 상품의 +버튼을 누르면

    장바구니 state의 0번째 상품을 ++ 해주세요

    id가 2인 상품의 +버튼을 누르면 

    장바구니 state의 2번째 상품을 ++ 해주세요

    라고 코드를 짰으니 그렇게 실행해줍니다 

    이 때 장바구니 state의 2번째 상품은 없어서 에러가 나는것일걸요 

     

    이걸 id가 0인 상품의 +버튼을 누르면 장바구니 state에서 id가 0인걸 찾아서 ++해주세요

    라고 바꾸거나 그러면 될듯요 

     

    #10468

    kimjs
    참가자

    위 코드에서 a.id가 state에 있는 상품의 id를 말하는게 아닐까요.....

     

    데이터 = a.id 

    a = state

    state = 상품

    a.id = 상품.id 혹시 제가 잘못알고 있는걸까요..

    #10483

    codingapple
    키 마스터

    a.id는 Cart.js <table>안에 있는 상품의 id입니다 

    예를 들면 지금 Cart.js <table>안에 상품2가 있으면 a.id가 2겠죠 뭐 

    그리고 a.id를 dispatch로 잘 날리고 있고요 

     

    근데 리듀서에서 수정할 때 "장바구니state에 있는 a.id번째 상품을 ++하라"는 코드가 문제되고 있는 것입니다 

     

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

About

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

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

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