-
글쓴이글
-
2021년 6월 16일 12:46 #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')
);=================================================
2021년 6월 16일 14:17 #10435
codingapple키 마스터아마도 지금 수량증가/감소 기능은
id가 1인 상품의 +/- 버튼을 누르면
copy[1].quan++; 이렇게 장바구니 state에서 1번째 들어있는 상품을 수정하라고 간단히 개발해놔서 그렇습니다
1번째 말고 id가 1인 상품을 수정하라고 개발해놓으면 되겠군요
2021년 6월 16일 16:26 #10443
kimjs참가자강의에서 알려주신 것 처럼 [액션.데이터].quan++ 을 사용하여 작성하였습니다.
0번째 상품을 장바구니에 옮겨놓으면 모든 것이 정상대로 동작합니다.
하지만 0번째 상품이 없으면 에러가 납니다.
2021년 6월 16일 18:36 #10451
codingapple키 마스터강의에서 작성한게 완벽한 코드인지 의심해봐야할 시간입니다
0번상품만 잘되는 이유는
지금 장바구니에 상품이 0번 2번이 저장되어있다고 합시다
그럼 장바구니 state가 [0번상품, 2번상품] 대충 이렇게 생겼겠군요
이제 실험해보면
id가 0인 상품의 +버튼을 누르면
장바구니 state의 0번째 상품을 ++ 해주세요
id가 2인 상품의 +버튼을 누르면
장바구니 state의 2번째 상품을 ++ 해주세요
라고 코드를 짰으니 그렇게 실행해줍니다
이 때 장바구니 state의 2번째 상품은 없어서 에러가 나는것일걸요
이걸 id가 0인 상품의 +버튼을 누르면 장바구니 state에서 id가 0인걸 찾아서 ++해주세요
라고 바꾸거나 그러면 될듯요
2021년 6월 17일 10:06 #10468
kimjs참가자위 코드에서 a.id가 state에 있는 상품의 id를 말하는게 아닐까요.....
데이터 = a.id
a = state
state = 상품
a.id = 상품.id 혹시 제가 잘못알고 있는걸까요..
2021년 6월 17일 12:33 #10483
codingapple키 마스터a.id는 Cart.js <table>안에 있는 상품의 id입니다
예를 들면 지금 Cart.js <table>안에 상품2가 있으면 a.id가 2겠죠 뭐
그리고 a.id를 dispatch로 잘 날리고 있고요
근데 리듀서에서 수정할 때 "장바구니state에 있는 a.id번째 상품을 ++하라"는 코드가 문제되고 있는 것입니다
-
글쓴이글
- 답변은 로그인 후 가능합니다.