Lieto: React ๊ธฐ์ดˆ์žก๊ธฐ ๐Ÿง—

๋ฐ•์ƒํ•˜ยท2024๋…„ 1์›” 10์ผ
1

Lieto

๋ชฉ๋ก ๋ณด๊ธฐ
2/9
post-thumbnail

์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ ์œ ์˜๋ฏธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” Props ๐ŸŽฏ

React๋Š” ์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ(๋” ํŽธํ•˜๊ฒŒ)ํ•จ์ˆ˜๋ฅผ ์งค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์— ์œ ๋ฆฌํ•˜๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์•ˆ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‚ฌ์šฉ ๋˜์—ˆ์„ ๋•Œ ์œ ์˜๋ฏธ ํ•˜์ง€ ์•Š๊ฒ ๋Š”๊ฐ€?

์ฆ‰, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ์— ์‹œ๋ฆฌ์ฆˆ ์ด๋ฏธ์ง€, ์ œ๋ชฉ, ์ถœ๊ฐ„์—ฐ๋„
์ด๋ ‡๊ฒŒ๋งŒ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋ฐ”๋€Œ์–ด์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜์–ด์žˆ๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š”๊ฒŒ ๋ฐ”๋กœ Props!

Props๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ ํ”„๋กœํผํ‹ฐ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

export function TapButton() {
  return (
    <li>
      <button onClick={}>{}</button>
    </li>
  );
}

// App.js

 <TapButton onSelect={() => handleSelect("jsx")}>JSX</TapButton>

์ž ์œ„ ์ฝ”๋“œ์—์„œ Props๋Š” ๋ฌด์—‡์„๊นŒ?

๋ฐ”๋กœ Property ํ˜•์‹์œผ๋กœ ๋“ค์–ด๊ฐ„ onSelect, JSX์ด๋‹ค!!

์ฆ‰, ํ‹€์„ ๋จผ์ € ๋งŒ๋“ค์–ด ๋†“๊ณ  ํ•ด๋‹น ๊ฐ’์„ ํ”„๋กœํผํ‹ฐ (Props)๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋™์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

export function TapButton(props) {
  return (
    <li>
      <button onClick={props.onSelect}>{props.children}</button>
    </li>
  );
}

props๋ผ๋Š” ๊ฐ์ฒด์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋“ค์ด ๋‹ด๊ฒจ์ ธ์˜จ๋‹ค ใ…Žใ…Ž

๊ทผ๋ฐ props.children์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋Š” ๋„ฃ์–ด์ค€์ ์ด ์—†๋Š”๋ฐ ์™œ ๋“ค์–ด๊ฐ€์žˆ?

์ด๋ฏธ ์ •ํ•ด์ง„ ๋‹ต์ •๋„ˆ props.children ๐ŸŽฏ

props๋ฅผ ์ด๋–ค ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ• ์ง€๋Š” ๊ฐœ๋ฐœ์ž ๋งˆ์Œ์ด๋‹ค. ใ…Žใ…Ž ๊ทธ๋Ÿฐ๋ฐ ์ด๋ฏธ ์ •ํ•ด์ง„ ๋…€์„์ด ์žˆ๋‹ค.

์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด

//React.jsx์—์„œ ์ผ๋ถ€ 
 <TapButton onSelect={() => handleSelect("jsx")}>๋‚˜์•ผ๋‚˜</TapButton>

์—์„œ ๋‚˜์•ผ๋‚˜ ๋ถ€๋ถ„์„ ๋ณด๋ฉด ์ปค์Šคํ…€์ปดํฌ๋„ŒํŠธ์ธ๋ฐ <></>์‚ฌ์ด์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค.

์—ฌ๊ธฐ์— ๋“ค์–ด๊ฐ„ ๊ฐ’์€ ์ž๋™์œผ๋กœ props.children์˜ ๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ๋œ๋‹ค.

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ ์œผ๋กœ ๋ Œ๋”๋ง ๋˜๊ฒŒ ๋„์™€์ฃผ๋Š” State ๐ŸŽฏ

State๋Š” React์—์„œ ์•„์ฃผ ์ค‘์š”ํ•œ ๋˜ ์œ ์šฉํ•œ ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.
useState๋ผ๋Š” Hook์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ณ€์ˆ˜์ธ State์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

state๋Š” useState๋ผ๋Š” React Hook์„ ํ†ตํ•ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

state๋Š” ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๋ฅผ ์žฌ์‹คํ–‰์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๋‹ค.

//App.jsx
const [value,setValue]=useState("์ดˆ๊ธฐ๊ฐ’")

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ณ  value์—๋Š” ์ดˆ๊ธฐ๊ฐ’์ด setValue๋Š” ํ•จ์ˆ˜๋กœ์„œ value๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์ฃผ์˜์‚ฌํ•ญโŒ

  1. value์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค
  2. useState๋Š” ์ปดํฌ๋„ŒํŠธํ•จ์ˆ˜์˜ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•ด์•ผํ•œ๋‹ค!

์ผ๋ฐ˜๋ณ€์ˆ˜ vs state ๐ŸŽฏ

์ผ๋ฐ˜๋ณ€์ˆ˜๋ฅผ ๊ฐ’์ด ๋ณ€๊ฒฝํ•˜๊ณ  ์ด ๊ฐ’์„ ๋™์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์— ๋„ฃ์–ด์ค€๋‹ค๋ฉด ? ์–ด๋–ป๊ฒŒ ๋ ๊นŒ

let value = "init";


return <div>
  <h1>{value}</h1>
<button onClick={()=>{value="changed"}}></button>
  </div>

์ด๋•Œ button์„ ๋ˆ„๋ฅด๋ฉด value์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด "changed"๊ฐ€ ์ฐํžˆ๊ฒŒ ๋ ๊นŒ?

๊ทธ๋ ‡์ง€ ์•Š๋‹ค!

์ผ๋ฐ˜๋ณ€์ˆ˜๋Š” ๊ฐ’์ด update๋˜์–ด๋„ UI๊ฐ€ Update๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿผ state๋Š” ??

state์˜ ๊ฒฝ์šฐ ๊ฐ’์ด ๋ณ€ํ•˜๊ฒŒ ๋˜๋ฉด useState Hook์ด ์ปดํฌ๋„ŒํŠธํ•จ์ˆ˜๋ฅผ ์žฌ๊ฒ€ํ† ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ƒˆ๋กญ๊ฒŒ ๋ Œ๋”๋งํ•ด์ค€๋‹ค.

const [value,setValue]=useState("init")

return <div>
  <h1>{value}</h1>
<button onClick={()=>setValue("changed")}></button>
  </div>

์ด๋ ‡๊ฒŒํ•˜๋ฉด ํ•ด๋‹น value๋Š” "changed"๋กœ ์ฐํžˆ๊ฒŒ ๋œ๋‹ค!

๊ทธ๋Ÿฐ๋ฐ React๋กœ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋งŽ์ด ๋งˆ์ฃผํ•œ๋‹ค.

setValueํ–ˆ๋Š”๋ฐ ์™œ value๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์•˜์ง€?(์‚ฌ์‹ค๋ณ€ํ•จใ…‹ใ…‹) ๐ŸŽฏ

์œ„ ์˜ˆ์ œ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ฐ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค.

const [value,setValue]=useState("init")
const change =()=>{
 setValue("changed")
  console.log(value)
}
return <div>
  <h1>{value}</h1>
<button onClick={change}></button>
  </div>

์ž ์ด๋Ÿฐ ๊ฒฝ์šฐ์— console.log(value)์˜ ๊ฒฐ๊ณผ๊ฐ’์€ ์–ด๋–ค ๊ฐ’์„ printํ•˜๊ฒŒ๋ ๊นŒ?

changed๋ฅผ ์˜ˆ์ƒํ•˜์ง€๋งŒ ์‚ฌ์‹ค init์ด ์ฐํžŒ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋Š” ๋ฆฌ์•กํŠธ์˜ ๋‚ด๋ถ€์›๋ฆฌ๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค.

React๋Š” State๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” setValue์™€ ๊ฐ™์€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ’์ด ๋ณ€๊ฒฝ๋ ๊ฑฐ๊ฐ™์œผ๋ฉด
์ด๋ฏธ ์Šค์ผ€์ค„๋ง์„ํ•œ๋‹ค. "๋‚˜ ๋ Œ๋”๋งํ•  ๋•Œ ๊ฐ’ ๋ฐ”๊ฟ€๊บผ์•ผ"
๊ทธ๋ฆฌ๊ณ  return์—์„œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ทธ๋ฆด ๋•Œ ๊ทธ๋•Œ ํ•ด๋‹น ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— setValue(๋น„๋™๊ธฐ)๋ฅผ ๋งˆ์ฃผํ–ˆ์„๋•Œ ๊ฐ’์ด ๋ณ€ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ
๋ Œ๋”๋งํ•  ๋•Œ ๊ฐ’์ด ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์•„์ง console.log()๋ฅผ ์ฐ์„ ๋• ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋งŒ์•ฝ ์ด๋Ÿฐ ์ƒํ™ฉ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

๋‚˜๋Š” setValueํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ๊ทธ ๊ฐ’์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๊ณ ์‹ถ์€๋ฐ..
์ด๋Ÿฐ ์ƒํ™ฉ์„ ์œ„ํ•ด useEffect Hook์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

useEffect ๐ŸŽฏ

useEffect๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ๋ฆฌํ„ด๋ ๋•Œ๋งˆ๋‹ค ์ž‘๋™ํ•œ๋‹ค. ์ฆ‰, ๋ฆฌ๋ Œ๋”๋ง์ด ๋ ๋•Œ ์ž‘๋™ํ•˜๋Š” ๋…€์„์ด๋‹ค.

์ด๋Ÿฐ ๋ชจ์Šต์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

useEffect(์–ด๋–คํ•จ์ˆ˜, [])

์ €๊ธฐ ์œ„ []๋Š” Deps๋ผ๊ณ ํ•˜๊ณ  dependency array์˜ ์•ฝ์ž์ด๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด๋กœ์„œ ์œ„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด? UseEffect๋ฅผ ์ž‘๋™ํ•˜๊ฒ ๋‹ค~~~ ๋ผ๋Š”๊ฑฐ๋‹ค.

๋งŒ์•ฝ ๊ทธ ๋ฐฐ์—ด์ด ๊บผ์ ธ์žˆ๋‹ค๋ฉด? ์ตœ์ดˆ์˜ 1ํšŒ๋งŒ ์ž‘๋™์„ ํ•˜๊ฒŒ ๋˜๋Š”๊ฑฐ๋‹ค (๋” ๋ณ€ํ•˜๋Š”๊ฒŒ ์—†์œผ๋‹ˆ๊นŒ!)

๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ด์–ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

const [value,setValue]=useState("init")
const change =()=>{
 setValue("changed")
}
useEffect(()=>{
  console.log(value)
},[value])

return <div>
  <h1>{value}</h1>
<button onClick={change}></button>
  </div>

์œ„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด value์— ๋Œ€ํ•œ ๋‹ค์Œ ๊ณผ์ •์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค!!

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด