Front-end/React
[React] 코딩애플 blog-part2-6 (Component 3개 만들고 props로 데이터 전송)
hyebin Lee
2021. 12. 31. 17:16
오늘은 상품의 재고가 몇개 남았는지 표시해볼 것이다.
일단 재고 데이터를 state에 저장해보자
let [inventory,inventoryChange] = useState([10,11,12])
저장한 state는 Detail.js가 아닌 App.js에서 만들어야 한다.
이유는 중요한 데이터들은 상위 컴포넌트에 보관하는것이 중요하다!!
모든 데이터는 위에서 밑으로 흐르기 때문!
다시 Detail.js에서 컴포넌트로 UI를 만들어 보자!
function Info() {
return <p>재고</p>;
}
이렇게 되면 컴포넌트 구조는 다음과 같다.
이제 아까 만든 재고 state 데이터를 바인딩 해야한다.
App → props → Detail
Detail → props → Info
props 를 두번 사용하여 전송한다.
App.js
<Route path="/detail/:id">
<Detail sticker={sticker} inventory={inventory} />
</Route>
Detail.js
<Info inventory={props.inventory} />
function Info(props) {
return <p>재고{props.inventory[0]}</p>;
}
주문하기를 누르면 재고 state에서 -1 하기
<내가 짠 코드>
*주의할점 : App.js에서 inventoryChange 변경함수도 전달해줘야한다!
<button
className="btn btn-danger"
onClick={() => {
let newArray = [...props.inventory];
newArray[0]--;
props.inventoryChange(newArray);
}}
>
Order
</button>
function Info(props) {
return <p>재고{props.inventory[0]}</p>;
}
이렇게 하면 0번째 상품 재고가 감소하는 것을 볼 수 있다.
<답안>
(App.js)
function App(){
let [재고, 재고변경] = useState([10,11,12]);
return (
<div>
<HTML많은곳/>
<Detail 재고={재고} 재고변경={재고변경} />
</div>
)
}
(Detail.js)
function Detail(props){
return (
<div>
<HTML많은곳/>
<button onClick={()=>{ props.재고변경([9,10,11]) }}> 주문하기 </button>
</div>
)
}
그런데 문제를 풀다가 의문이 생겼다.
답안을 보면 props.재고변경([9,10,11])이런식으로 전체의 변경하셨다.
왜 이렇게 했을까 의문이 생겨서 질문을 하려다가 누군가 같은 질문을 올린것을 보고 찾아보았다.
<답변>
useState로 만든 state 변경함수는 언제나 () 안에 있는 값으로 state를 바꿔치기 해주는 함수라서
원래 state가 [1,2,3] 인데 첫째만 +1 해주고 싶으면 항상 변경함수( [2,2,3] ) 이렇게 써야합니다
싫다면 옛날 class 문법으로 컴포넌트와 state 만들었을 때 setState() 함수 쓰면 object자료의 경우 원하는 곳만 변경가능합니다
혹은 다른 라이브러리 추가하거나 vue 쓰면 됩니다
리액트를 만만하게 보면 안되겠구나,,하는 생각이 들었다. 😓
그래도 part2를 무사히 끝내서 기분이 좋다. ^_^