3. useRef

์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์• ์ฃผ๊ธฐ ์ „์ฒด์— ๊ฑธ์ณ์„œ ์œ ์ง€๋˜๋Š” ๊ฐ์ฒด.

์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋™์ผํ•œ ๊ฐ์ฒด๊ฐ€ ์œ ์ง€๋œ๋‹ค.

๊ฐ์ฒด ์ž์ฒด๊ฐ€ ๊ฐ’์€ ์•„๋‹ˆ๊ณ , ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด. ์ฆ‰, ์–ธ์ œ๋“ ์ง€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒํƒœ(state)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์™€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€๋งŒ,

๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด์˜ ํ˜„์žฌ ๊ฐ’(current)์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์ฃผ์š” ์šฉ๋„:

  1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ๊นŒ์ง€ ๋™์ผํ•œ ๊ฐ’์„ ์จ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ. โ‡’ input ๋“ฑ์˜ ID ๊ด€๋ฆฌ.

  2. (ํŠนํžˆ useEffect ๋“ฑ๊ณผ ํ•จ๊ป˜ ์“ฐ๋ฉด์„œ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š”) ๋น„๋™๊ธฐ ์ƒํ™ฉ์—์„œ ํ˜„์žฌ ๊ฐ’์„ ์ œ๋Œ€๋กœ ์“ฐ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ.

Closure โ†’ ๋ณ€์ˆ˜๋ฅผ capture, bind๋ฅผ ๊นœ๋นกํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ข…์ข… ์ผ์–ด๋‚จ.

import { useEffect, useRef, useState } from "react";

function Timer() {
    useEffect(()=>{
        const savedTitle = document.title;

  const id = setInterval(()=>{
   document.title = `Now: ${new Date().getTime()}`;
  },2000)

        return () => {
        clearInterval(id)
        document.title = savedTitle // ์ €์žฅํ•ด๋‘” title๋กœ ์›๋ณตํ•ด์ค€๋‹ค.
        // ๊ฒฐ๋ก ์ ์œผ๋กœ useEffect์˜ return์€ ๋๋‚ ๋•Œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ์ด๋‹ค.
    }
 })

    return <p>Playing</p>
}

export default function TimerControl() {
    // const ref = {
    //     value: 1,
    // }
    // ref.value = 2
    // ์ด๋Ÿฐ ref๋ฅผ ๋งŒ๋“ค๊ณ 
    // const๋กœ ๋งŒ๋“  ref ์ง€๋งŒ ref.value์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฐ ๊ฐœ๋….
    // ๊ฐ์ž ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ž์‹ ๋“ค๋งŒ์˜ ์ด๋Ÿฐ ๊ฐ์ฒด๋ฅผ ๊ฐ–๊ณ ์‹ถ์–ด -> useRef

    const ref = useRef(1)
    // useState๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์™€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•จ.
    // useRef๋Š” ref.current ๊ฐ’์ด ๋ณ€ํ•ด๋„ ๋ฆฌ๋ Œ๋” ์•ˆํ•จ. 
    // ๋‹ค๋ฅธ ์ด์œ ๋กœ ๋ Œ๋”๋ ๋•Œ๋งŒ ๋ฐ˜์˜๋จ.

    const [playing, setPlaying] = useState(false)

    const handleClick = () => {
        ref.current += 1
        // setPlaying(!playing)
    }
console.log(ref.current,'ss')
    return (
        <div>
            {/* {playing ?(
                <Timer />
            ): (
                <p>Stop</p>
            ) } */}
            <button type="button" onClick={handleClick}>
                Toggle
            </button>
            <button type="button" onClick={()=>console.log(ref.current)}>see ref</button>

            <p>{ref.current}</p>
        </div>
    )
}

์‹ค์Šต ๋ ˆํฌ - useRef ๋ธŒ๋žœ์น˜ ์ฐธ๊ณ 

Last updated