Frontend ๐Ÿ“š/React

[ ์ฝ”๋”ฉ์• ํ”Œ ] React ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ Part4

leejaejae 2023. 10. 14. 17:54

โœ๏ธ Props

- ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ props ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „์†กํ•˜๋ฉด ์ž์‹๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

์ž์‹ → ๋ถ€๋ชจ ๋ถˆ๊ฐ€๋Šฅ!
๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „์†ก ๋ถˆ๊ฐ€๋Šฅ!

โœ๏ธ props๋กœ ๋ถ€๋ชจ → ์ž์‹ state ์ „์†กํ•˜๋Š” ๋ฒ•
1. ์ž์‹ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์— ๊ฐ€์„œ <์ž์‹์ปดํฌ๋„ŒํŠธ ์ž‘๋ช… = { state ์ด๋ฆ„} />
2. ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“œ๋Š” function์œผ๋กœ ๊ฐ€์„œ props๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ๋ก ํ›„ props. ์ž‘๋ช… ์ด์šฉ

๐Ÿ’‍โ™€๏ธ ์˜ˆ์‹œ

function App (){

  let [๊ธ€์ œ๋ชฉ, ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ] = useState(['๋‚จ์ž์ฝ”ํŠธ ์ถ”์ฒœ', '๊ฐ•๋‚จ ์šฐ๋™๋ง›์ง‘', 'ํŒŒ์ด์ฌ๋…ํ•™']);
  
  return (
    <div>
      <Modal ๊ธ€์ œ๋ชฉ={๊ธ€์ œ๋ชฉ}></Modal>  <!-- < ์ž์‹์ปดํฌ๋„ŒํŠธ ์ž‘๋ช…={state ์ด๋ฆ„} /> -->
    </div>
  )
}

// props ๋“ฑ๋ก
function Modal(props){
  return (
    <div className="modal">
      <h4>{ props.๊ธ€์ œ๋ชฉ[0] }</h4>  <!-- props.์ž‘๋ช… -->
      <p>๋‚ ์งœ</p>
      <p>์ƒ์„ธ๋‚ด์šฉ</p>
    </div>
  )
}


โœ๏ธ props๋Š” ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฌธ๋ฒ•๊ณผ ๋˜‘๊ฐ™๋‹ค!

function Modal(props){
  return (
    <div className="modal" style={{ background : props.color }}>
      <h4>{ props.๊ธ€์ œ๋ชฉ[0] }</h4>
      <p>๋‚ ์งœ</p>
      <p>์ƒ์„ธ๋‚ด์šฉ</p>
    </div>
  )
}

- props.color ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ตฌ๋ฉ์„ ๋šซ์–ด๋†“์œผ๋ฉด ์ด์ œ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•  ๋•Œ <Modal color={'red'} /> ์ด๋Ÿฌ๋ฉด ํ•˜๋Š˜์ƒ‰ ๋ชจ๋‹ฌ์ฐฝ์ด ์ƒ์„ฑ๋œ๋‹ค!

๐Ÿ’‍โ™€๏ธ ํด๋ฆญํ•œ ๊ธ€์ œ๋ชฉ์ด ๋ชจ๋‹ฌ์ฐฝ ์•ˆ์— ๋œจ๊ฒŒ ํ•˜๊ธฐ!
1. html css๋กœ ๋ฏธ๋ฆฌ ๋””์ž์ธ
2. ํ˜„์žฌ UI์˜ ์ƒํƒœ๋ฅผ state๋กœ ๋งŒ๋“ค๊ธฐ
3. state ์ข…๋ฅ˜์— ๋”ฐ๋ผ UI๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ์ž‘์„ฑ

function App (){

  let [๊ธ€์ œ๋ชฉ, ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ ] = useState(['์ฝ”ํŠธ ์ถ”์ฒœ', '์šฐ๋™ ๋ง›์ง‘ ์ถ”์ฒœ']);
  let [๋”ฐ๋ด‰, ๋”ฐ๋ด‰๋ณ€๊ฒฝ] = useState(0);
  let [modal, setModal] = useState(false);
  let [title, setTitle] = useState(0);
  
  return (
    <div>
      { 
        ๊ธ€์ œ๋ชฉ.map(function(a, i){
          return (
          <div className="list">
            <h4 onClick={()=>{ setModal(true); setTitle(i); }}>{ ๊ธ€์ œ๋ชฉ[i] }</h4>
            <p>2์›” 18์ผ ๋ฐœํ–‰</p>
          </div> )
        }) 
      }
    </div>
  )
}

function Modal(props){
  return (
    <div className="modal">
      <h4>{ props.๊ธ€์ œ๋ชฉ[props.title] }</h4>  <!-- title์€ ๋ถ€๋ชจ๊ฐ€ ๊ฐ€์ง„ state์ด๋ฏ€๋กœ ์ž์‹์ด ์‚ฌ์šฉํ•  ๋• props๋กœ ์ „์†ก -->
      <p>๋‚ ์งœ</p>
      <p>์ƒ์„ธ๋‚ด์šฉ</p>
    </div>
  )
}

 

โ—๏ธ state๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ๋งŒ๋“ค์–ด๋ฒ„๋ฆฌ๋ฉด props ์ „์†ก์ด ํ•„์š”ํ•œ๊ฐ€?
 ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค! title๊ฐ™์€ state๋„ ์ž์‹์ปดํฌ๋„ŒํŠธ ์•ˆ์— ๋งŒ๋“ค๋ฉด ํŽธ๋ฆฌํ•˜๊ฒ ์ง€๋งŒ ์ง€๊ธˆ title์ด๋ผ๋Š” state๋Š” App๋„ ์“ฐ๊ณ  Modal๋„ ์“ฐ๊ณ  ์žˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ์“ฐ์ด๋Š” state๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค ์ค‘ ์ตœ๊ณ ๋กœ ๋†’์€ ๋ถ€๋ชจ์—๊ฒŒ ๋งŒ๋“ค์–ด๋†”์•ผํ•œ๋‹ค

 

โœ๏ธ <input> ํƒœ๊ทธ ์‚ฌ์šฉํ•˜๊ธฐ

<input type="text"/>
<input type="range"/>
<input type="date"/>
<input type="number"/>
<textarea></textarea>
<select></select>

- ์œ ์ €์˜ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ•์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์œผ๋ฉด HTML์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ ํƒœ๊ทธ ์ด์šฉ ๊ฐ€๋Šฅ

โœ๏ธ <input>์— ๋ญ”๊ฐ€ ์ž…๋ ฅ์‹œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด
- onChange, onInput ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ถ€์ฐฉ

<input onChange={()=>{ ์‹คํ–‰ํ•  ์ฝ”๋“œ }}/>


โœ๏ธ <input>์— ์ž…๋ ฅํ•œ ๊ฐ’ ๊ฐ€์ ธ์˜ค๋Š” ๋ฒ•
- e๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€, e.target.value๋ผ๊ณ  ์ ๊ธฐ.
- ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ๋“ค์–ด๊ฐ€๋Š” ํ•จ์ˆ˜์— ์ €๋ ‡๊ฒŒ ํŒŒ๋ผ๋ฏธํ„ฐ e๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด e๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด.,๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ ํ˜„๋Œ€ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์™€ ๊ด€๋ จ๋œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ์ผ์ข…์˜ ๋ณ€์ˆ˜๋‹ค! ( ์ž‘๋ช…์€ e ๋ง๊ณ  ์ž์œ ๋กญ๊ฒŒ ๊ฐ€๋Šฅ)
- e.target: ํ˜„์žฌ ์ด๋ฒคํŠธ ๋ฐœ์ƒํ•œ ๊ณณ ์•Œ๋ ค์ฃผ๊ธฐ
- e.preventDefault(): ์ด๋ฒคํŠธ ๊ธฐ๋ณธ ๋™์ž‘ ๋ง‰๊ธฐ
- e.stopPropagation(): ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋ง‰๊ธฐ ( ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ข‹์•„์š” ๋ฒ„ํŠผ ๋ˆ„๋ฅผ ๋•Œ ๋ชจ๋‹ฌ์ฐฝ๋„ ๊ฐ™์ด ๋– ๋ฒ„๋ฆฌ๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ)

<input onChange={(e)=>{ console.log(e.target.value) }}/>


โœ๏ธ ์‚ฌ์šฉ์ž๊ฐ€ input์— ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ
- ์‚ฌ์šฉ์ž๊ฐ€ input์— ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋Š” state ์•„๋‹ˆ๋ฉด ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ .

function App (){

  let [์ž…๋ ฅ๊ฐ’, ์ž…๋ ฅ๊ฐ’๋ณ€๊ฒฝ] = useState('');  // ๋”ฐ์Œํ‘œ 2๊ฐœ๋Š” ๋นˆ๋ฌธ์ž๋ฅผ ๋œปํ•จ
  
  return (
    <input onChange={(e)=>{ 
      ์ž…๋ ฅ๊ฐ’๋ณ€๊ฒฝ(e.target.value) 
      console.log(์ž…๋ ฅ๊ฐ’)
    }} />
  )
}

 

- ์ฐธ๊ณ ! state ๋ณ€๊ฒฝํ•จ์ˆ˜๋Š” ๋น„๋™์ (async)์ด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์„œ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ์•ฝ๊ฐ„ ๋Šฆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  js์—์„  ๋Šฆ๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š” ์ฝ”๋“œ๋“ค์„ ์ž ๊น ์ œ์น˜๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ์ค„์„ ์‹คํ–‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ console.log(์ž…๋ ฅ๊ฐ’) ์ด๊ฒŒ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.

 

โœ๏ธ ์‹ค์Šต

๐Ÿ’‍โ™€๏ธ ๊ธ€ ๋ฐœํ–‰ ๊ธฐ๋Šฅ

function App (){

  let [๊ธ€์ œ๋ชฉ, ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ] = useState(['๋‚จ์ž์ฝ”ํŠธ์ถ”์ฒœ', '๊ฐ•๋‚จ์šฐ๋™๋ง›์ง‘', 'ํŒŒ์ด์ฌ๋…ํ•™']);
  let [์ž…๋ ฅ๊ฐ’, ์ž…๋ ฅ๊ฐ’๋ณ€๊ฒฝ] = useState('');
  
  return (
    <div>
      <input onChange={ (e)=>{ ์ž…๋ ฅ๊ฐ’๋ณ€๊ฒฝ(e.target.value) } } />
      <button onClick={()=>{ 
        let copy = [...๊ธ€์ œ๋ชฉ];  <!-- ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์ผ๋‹จ ๊ธ€์ œ๋ชฉ state ์นดํ”ผ -->
        copy.unshift(์ž…๋ ฅ๊ฐ’);  <!-- unshift: array ์ž๋ฃŒ ๋งจ ์•ž์— ์ž๋ฃŒ ์ถ”๊ฐ€ -->
        ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ(copy)  <!-- state ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ์‚ฌ์šฉ -->
      }}>๊ธ€๋ฐœํ–‰</button>
    </div>
  )
}

โ—๏ธ์ฐธ๊ณ : ์›๋ž˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด html, js ํŒŒ์ผ์„ ๋‹ค์‹œ ์ฝ๋Š”๋‹ค. ๋‹ค์‹œ ์ฝ๊ฒŒ ๋˜๋ฉด state๋‚˜ ๋ณ€์ˆ˜๊ฐ™์€ ๊ฒƒ๋“ค๋„ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋จ. ๋”ฐ๋ผ์„œ ํ”„๋ก ํŠธ์—”๋“œ๋งŒ ๊ตฌํ˜„ํ–ˆ์„ ๊ฒฝ์šฐ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค.

๐Ÿ’‍โ™€๏ธ ๊ธ€๋งˆ๋‹ค ์‚ญ์ œ๋ฒ„ํŠผ๊ณผ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

function App (){

  let [๊ธ€์ œ๋ชฉ, ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ] = useState(['๋‚จ์ž์ฝ”ํŠธ์ถ”์ฒœ', '๊ฐ•๋‚จ์šฐ๋™๋ง›์ง‘', 'ํŒŒ์ด์ฌ๋…ํ•™']);
  let [์ž…๋ ฅ๊ฐ’, ์ž…๋ ฅ๊ฐ’๋ณ€๊ฒฝ] = useState('');
  
  return ( 
    <div>
    { 
     ๊ธ€์ œ๋ชฉ.map(function(a, i){
        return (
          <div className="list">
            <h4>{ ๊ธ€์ œ๋ชฉ[i] }</h4>
            <p>2์›” 18์ผ ๋ฐœํ–‰</p>
            <button onClick={()=>{ 
              let copy = [...๊ธ€์ œ๋ชฉ];  <!-- ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ๊ธ€์ œ๋ชฉ state ๋ณต์‚ฌ -->
              copy.splice(i, 1);  <!-- array์ž๋ฃŒ์—์„œ x๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์‚ญ์ œ -->
              ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ(copy);
           }}>์‚ญ์ œ</button>
          </div> 
        )
     }) 
    }  
  </div>
  )
}

 


๋ณธ ํฌ์ŠคํŒ…์€ << React ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ๊นŒ์ง€! >> ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•ฉ๋‹ˆ๋‹ค.