๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/React

[React] ์ƒ์„ธ ํŽ˜์ด์ง€์— ์žฌ๊ณ  ๋ฐ์ดํ„ฐ ํ‘œ์‹œํ•˜๊ธฐ

by Connecting-the-dots 2022. 3. 26.
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
๋ฐ˜์‘ํ˜•