Props์™€ State์™€ Ref

์กฐ์˜ˆ์ง„ยท2022๋…„ 1์›” 17์ผ
0

๋ฉด์ ‘ ์˜ค๋‹ต๋…ธํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
3/4
post-thumbnail

๐Ÿคต State์™€ Ref์˜ ์ฐจ์ด๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?
๐Ÿ™Ž ???
๐Ÿคต ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ref์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๋‹ค์‹œ ๋ Œ๋”๋ง์ด ๋ ๊นŒ์š”?

function MyComponent() {
  const ref = useRef(3)
  return <div>{ref.current}</div>
}

Props

Props๋Š” Properties์˜ ์ค„์ž„์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ ์˜ต์…˜์ด๋‚˜ ์„ค์ •๊ณผ ๊ฐ™์€ ๊ฐ’์œผ๋กœ, ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋˜๋ฉฐ ๋ถˆ๋ณ€ํ•˜๋Š” ๊ฐ’์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ๋Š” props ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋‚˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ props ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.

State

State๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ๋˜๊ณ , ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๋‹ค. ๋ณดํ†ต ์œ ์ € ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด์„œ ๋ณ€๊ฒฝ๋œ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ state๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. state๋Š” privateํ•œ ๊ฐ’์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ state๋ฅผ ๊ผญ ๊ฐ€์ ธ์•ผ ํ•  ํ•„์š”๋Š” ์—†๋‹ค. state๋Š” ๋ณต์žก์„ฑ์„ ๋†’์ด๊ณ  ์˜ˆ์ธก๊ฐ€๋Šฅ์„ฑ์„ ๋‚ฎ์ถ”๋ฏ€๋กœ state๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ props ๊ฐ’๊ณผ state ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ํ˜„์žฌ ๋ Œ๋”๋ง๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜
  • ์ง์ ‘ State๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ (์ง์ ‘ state๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ constructor ์•ˆ์—์„œ๋งŒ ๊ฐ€๋Šฅ)
  • setState()๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•จ
  • setState()๋Š” ๋น„๋™๊ธฐ์ ์ผ ์ˆ˜๋„ ์žˆ์Œ. ์–ด๋–ค ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ setState()๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค๊ณ  ํ•ด๋„, ๊ทธ ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ณ , ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ setState()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ์ž„.

Ref

render ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ DOM ๋…ธ๋“œ ํ˜น์€ React ์—˜๋ฆฌ๋จผํŠธ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์œผ๋กœ,

  • ์ƒ์„ฑ: this.myRef = React.createRef()
  • ์ „๋‹ฌํ•˜๊ธฐ: jsx์—์„œ <div ref={this.myRef} />
  • ์ ‘๊ทผํ•˜๊ธฐ: const node = this.myRef.current

์—˜๋ฆฌ๋จผํŠธ์— ref๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, ๋…ธ๋“œ๋ฅผ ํ–ฅํ•œ ์ฐธ์กฐ๋Š” ref.current์— ๋‹ด๊ธด๋‹ค.

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useRef() hook API๋กœ ref์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ƒ์„ฑ: const ref = useRef(null)
  • ์ „๋‹ฌํ•˜๊ธฐ: <input ref={ref} type="text" />
  • ์ ‘๊ทผํ•˜๊ธฐ: ref.current.focus();

useRef()์—์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ref ๊ฐ์ฒด๋Š” DOM ref๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ref ๊ฐ์ฒด๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค ๊ฐ’์ด๋“  ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค. class์˜ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์™€ ์œ ์‚ฌํ•˜๋‹ค. ๊ทธ๋ž˜์„œ setInterval ๊ฐ™์€ ์ธํ„ฐ๋ฒŒ์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

  const intervalRef = useRef();

  useEffect(() => {
    const id = setInterval(() => {
      // ...
    });
    intervalRef.current = id;
    return () => {
      clearInterval(intervalRef.current);
    };
  });

useRef()๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ref ๊ฐ์ฒด๋Š” ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋‹ค๋ฅธ ์ ์€, ref ๊ฐ์ฒด๋Š” ๋ Œ๋”๋ง์ด ๋˜์–ด๋„ ํ•ญ์ƒ ๋™์ผํ•œ ref ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
useRef()์€ ๊ทธ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ณ€๊ฒฝ๋œ ์‚ฌ์‹ค์„ ์•Œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ref.current ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์งˆ๋ฌธ์˜ ์ƒํ™ฉ์—์„œ๋Š” ๋ Œ๋”๋ง์ด ๋‹ค์‹œ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์ •๋‹ต์ด๋‹ค.

๋ฒ„ํŠผ ํด๋ฆญ์„ ํ•ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ˆซ์ž๊ฐ€ ๋Š˜์–ด๋‚˜์ง€ ์•Š์ง€๋งŒ, ์ฝ˜์†”์—๋Š” ๋ณ€๊ฒฝ๋œ ref.current ๊ฐ’์ด ๊ณ„์† ์ถœ๋ ฅ๋˜๊ณ  ์žˆ๋‹ค.

profile
https://oooooroblog.com ์œผ๋กœ ์ด์‚ฌ๊ฐ”์–ด์š”

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