728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์ค๋์ ์์ธ ํ์ด์ง์ ์ฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ํ์ํด๋ณด์๋ค.
- ๋ฟ๋ง ์๋๋ผ ์ฌ๊ณ ๋ฐ์ดํฐ๋ ์ฃผ๋ฌธ ๋ฐ ์ฃผ๋ฌธ์ทจ์์ ์์ ๋ฐ๋ผ ๊ฐ์๊ฐ ์ ๋์ ์ผ๋ก ๋ณํ๋ฏ๋ก, ์ด์ ์ ์ฌํ๊ฒ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ ๋๋ ์ ๋ ์ฌ๊ณ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ํ๋๋ก ๊ตฌํํด๋ณด์๋ค.
๐ ์์ธ ํ์ด์ง์ ์ฌ๊ณ ๋ฐ์ดํฐ ํ์ํ๊ธฐ
- ์์ธ ํ์ด์ง์ "์ฃผ๋ฌธํ๊ธฐ", "๋ค๋ก๊ฐ๊ธฐ" ๋ฒํผ ์์ ์ฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ธฐ๋ก ํ๋ค.
๐ค ์ฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ state ๋ง๋ค๊ธฐ
let [leftAll, setLeftAll] = useState([10, 11, 12]);
- DB ๋ฅผ ์ด์ฉํด์ ๊ตฌํํ๋ ๊ฒ ์๋๊ธฐ ๋๋ฌธ์ ์ต์์ ํ์ผ์ธ App.js ํ์ผ์ ์์๋ก 0๋ฒ ์ํ, 1๋ฒ ์ํ, 2๋ฒ ์ํ์ ์ฌ๊ณ ๋ฐ์ดํฐ array ๋ฅผ leftAll ์ด๋ผ๋ state ์ ์ ์ฅํด์ฃผ์๋ค.
๐ค ๋ง๋ค์ด๋์ state ๋ฅผ Component ๋ก ์ ์กํ๊ธฐ
<Route path='/detail/:id'>
<Detail shoes={shoes} setShoes={setShoes} leftAll={leftAll} setLeftAll={setLeftAll}/>
</Route>
- ์ด์ ๋ง๋ค์ด๋์ state ๋ฅผ Detail Component ๋ก ๋ณด๋ด์ฃผ๋ฉด ๋๋ค.
- ๋๋ ์์ ๊ฐ์ด leftAll ์ด๋ผ๋ state ๋ leftAll ์ด๋ผ๋ ๋ณ์๋ช ์ผ๋ก, setLeftAll ์ด๋ผ๋ state ๋ setLeftAll ์ด๋ผ๋ ๋ณ์๋ช ์ผ๋ก ์ ์กํด์ฃผ์๋ค.
- ์ด์ Detail Component ์์ props ๋ก ๋ฐ์์์ leftAll ๊ณผ setLeftAll ์ด๋ผ๋ ์ด๋ฆ์ state ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๐ค ์ฌ๊ณ ๋ฐ์ดํฐ Component ๋ง๋ ํ html ํ๊ทธ์ ์ถ๊ฐํ๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
function LeftInfo(props) {
return (
<p> ์ฌ๊ณ : {props.leftOne}</p>
)
}
function Detail(props) {
let findId = props.shoes.find(function(item) {
return item.id === parseInt(id);
});
return (
<div className="container">
<div className="row">
<div className="col-md-7">
<img src={`https://codingapple1.github.io/shop/shoes${parseInt(findId.id)+1}.jpg`} width="100%">
</div>
<div className="col-md-5 mt-4">
<h4 className="pt-5">{findId.title}</h4>
<p>{findId.content}</p>
<p>{findId.price}</p>
<LeftInfo leftOne={props.leftAll[findId.id]}/>
<button className="btn btn-danger mx-1">์ฃผ๋ฌธํ๊ธฐ</button>
<button className="btn btn-danger mx-1" onClick={()=>{history.goBack()}}>๋ค๋ก๊ฐ๊ธฐ</button>
</div>
</div>
</div>
)
}
<LeftInfo leftOne={props.leftAll[findId.id]}/>
- ์ผ๋จ LeftInfo ๋ผ๋ ์ด๋ฆ์ผ๋ก Components ๋ฅผ ๋ง๋ค์ด์ค ๊ฑฐ๊ธฐ ๋๋ฌธ์ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ ํ๊ทธ ์๋ถ๋ถ์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.
- ๊ธฐ์กด์ leftAll ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ [10, 11, 12] ๋ผ๋ array ํํ์ ์๋ฃํ์ด๊ธฐ ๋๋ฌธ์ 0๋ฒ ์ํ์ ์์ธ ํ์ด์ง๋ผ๋ฉด leftAll[0], 1๋ฒ ์ํ์ ์์ธ ํ์ด์ง๋ผ๋ฉด leftAll[1] ์ด๋ฐ ์์ผ๋ก ๊ฐ์ ธ์์ผ ์ฌ๊ณ ์๋์ ๋ณด์ฌ์ค ์ ์๋ค.
- ๋ฐ๋ผ์ props.leftAll[findId.id] ๋ฅผ leftOne ์ด๋ผ๋ ๋ณ์๋ช ์ผ๋ก LeftInfo Components ์ ์ ์กํด์ฃผ์๋ค.
function LeftInfo(props) {
return (
<p> ์ฌ๊ณ : {props.leftOne}</p>
)
}
- ๊ทธ๋ฌ๊ณ ๋์ LeftInfo Component ์์ props ๋ก leftOne ์ ๋ฐ์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.
- ์ฌ๊ธฐ๊น์ง๋ง ํ๋ฉด 0๋ฒ ์ํ, 1๋ฒ ์ํ, 2๋ฒ ์ํ์ ์์ธ ํ์ด์ง์ ๋ค์ด๊ฐ์ ๋ ๊ฐ๊ฐ์ ์ฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์๋ค.
๐ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฌ๊ณ ๋ฐ์ดํฐ ๊ฐ์ํ๋๋ก ๋ง๋ค๊ธฐ
- ์ฌ๊ณ ๋ฐ์ดํฐ๋ ์ฃผ๋ฌธ ๋ฐ ์ฃผ๋ฌธ์ทจ์์ ๋ฐ๋ผ ๊ฐ์๊ฐ ๋ณํ๋ค.
- ๊ทธ๋์ ์ด๋ฒ์๋ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฌ๊ณ ๋ฐ์ดํฐ๊ฐ ํ๋์ฉ ๊ฐ์ํ๋๋ก ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด์๋ค.
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
function LeftInfo(props) {
return (
<p> ์ฌ๊ณ : {props.leftOne}</p>
)
}
function changeLeftAll(props, id) {
let newLeftAll = [...props.leftAll];
newLeftAll[id] = props.leftAll[id] - 1;
props.setLeftAll(newLeftAll);
}
function Detail(props) {
let findId = props.shoes.find(function(item) {
return item.id === parseInt(id);
});
return (
<div className="container">
<div className="row">
<div className="col-md-7">
<img src={`https://codingapple1.github.io/shop/shoes${parseInt(findId.id)+1}.jpg`} width="100%">
</div>
<div className="col-md-5 mt-4">
<h4 className="pt-5">{findId.title}</h4>
<p>{findId.content}</p>
<p>{findId.price}</p>
<LeftInfo leftOne={props.leftAll[findId.id]}/>
<button className="btn btn-danger mx-1" onClick={()=>{changeLeftAll(props, findId.id)}}>์ฃผ๋ฌธํ๊ธฐ</button>
<button className="btn btn-danger mx-1" onClick={()=>{history.goBack()}}>๋ค๋ก๊ฐ๊ธฐ</button>
</div>
</div>
</div>
)
}
- ์๋ฅผ ๋ค์ด, 0๋ฒ ์ํ์ ์์ธ ํ์ด์ง์์ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ ๋๋ฅด๋ฉด 0๋ฒ ์ฌ๊ณ ๋ฐ์ดํฐ์ ํด๋นํ๋ 10์ด๋ผ๋ ์ซ์๊ฐ 9๋ก ๋ฐ๋์ด์ผ ํ๋ค.
- ์ฆ, leftAll ์ด๋ผ๋ state ๊ฐ [10, 11, 12] ์์ [9, 11, 12] ๋ก ๋ณํด์ผ ํ๋ค.
- ์ด๋ฐ์์ผ๋ก array ํํ์ state ๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์ด์ ์ ์ฌ๋ฌ ๋ฒ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ง ์์๋ค.
<button className="btn btn-danger mx-1" onClick={()=>{changeLeftAll(props, findId.id)}}>์ฃผ๋ฌธํ๊ธฐ</button>
- ๋จผ์ ํจ์๋ช ๋ถํฐ changeLeftAll ์ด๋ผ๊ณ ์ ํด์ฃผ์๋ค.
- leftAll ๊ณผ setLeftAll ์ด๋ผ๋ state ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก props ๋ฅผ ๋ฐ์์ฌ ์ ์๋๋ก ํด์ฃผ์๋ค.
- ๋ํ ๋ช ๋ฒ ์ํ์ ์์ธ ํ์ด์ง๋์ ๋ฐ๋ผ leftAll ์์ ์์ ํด์ผํ ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์ํ ๋ฒํธ์ ํด๋นํ๋ findId.id ๋ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ฌ ์ ์๋๋ก ํด์ฃผ์๋ค.
function changeLeftAll(props, id) {
let newLeftAll = [...props.leftAll];
newLeftAll[id] = props.leftAll[id] - 1;
props.setLeftAll(newLeftAll);
}
- ์๋ณธ array ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ๋จผ์ props ๋ก ๋ฐ์์จ leftAll ์ด๋ผ๋ state ์ ์ฌ๋ณธ array ๋ฅผ ๋ง๋ค์ด์ newLeftAll ์ด๋ผ๋ ๋ณ์์ ํ ๋นํด์ฃผ์๋ค.
- ๊ทธ๋ฆฌ๊ณ newLeftAll array ๋ด์ ์๋ ๋ฐ์ดํฐ๋ค ์ค์ id ์ ์ผ์นํ๋ ์ธ๋ฑ์ค์ ๊ฐ์์ -1 ํด์ฃผ์ด์ผ ํ๋ฏ๋ก, newLeftAll[id] = props.leftAll[id] - 1; ์ด๋ผ๊ณ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.
- ์ด์ newLeftAll ์๋ ํ์ฌ ์์ธํ์ด์ง์ ์ฌ๊ณ ๋ฐ์ดํฐ๊ฐ 1๊ฐ ๊ฐ์๋ array ํํ์ ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋๊ณ , ์ด๋ฅผ setLeftAll() ์ ๋ฃ์ด์ฃผ๋ฉด ์ต์ข ์ ์ผ๋ก leftAll ์ด๋ผ๋ state ๊ฐ ์์ ๋๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Tab ๋ง๋ค๊ณ ์ ๋๋ฉ์ด์ ์ถ๊ฐํ๊ธฐ (0) | 2022.03.27 |
---|---|
[React] props ๋์ Context API ์ฌ์ฉํด๋ณด๊ธฐ (1) | 2022.03.27 |
[React] React ์์ Ajax ์์ฒญํ๊ธฐ_2 (1) | 2022.03.26 |
[React] React ์์ Ajax ์์ฒญํ๊ธฐ (0) | 2022.03.26 |
[React] useEffect ๊ณผ์ ํ๊ธฐ (0) | 2022.03.26 |