dev_been94 2024. 12. 14. 15:42
728x90
λ°˜μ‘ν˜•

useRef

 

🎯 useRefλž€ λ¬΄μ—‡μΈκ°€μš”?

**useRef**λŠ” μ»΄ν¬λ„ŒνŠΈ μ•ˆμ—μ„œ κ°’μ΄λ‚˜ DOM μš”μ†Œλ₯Ό μ €μž₯ν•˜κ³  관리할 λ•Œ μ‚¬μš©ν•΄μš”.
μ—¬κΈ°μ„œ μ€‘μš”ν•œ ν¬μΈνŠΈλŠ”:

  • 값이 λ°”λ€Œμ–΄λ„ 화면이 λ‹€μ‹œ λ Œλ”λ§λ˜μ§€ μ•Šμ•„μš”.
  • DOM μš”μ†Œ(HTML μš”μ†Œ)에 직접 μ ‘κ·Όν•  λ•Œλ„ μ‚¬μš©ν•  수 μžˆμ–΄μš”.

 

πŸ“¦ μƒμžλ₯Ό κΈ°μ–΅ν•˜λŠ” 이야기

μ—¬λŸ¬λΆ„μ΄ 물건을 λ‹΄μ•„λ‘λŠ” μƒμžλ₯Ό ν•˜λ‚˜ κ°€μ§€κ³  μžˆλ‹€κ³  상상해 λ³΄μ„Έμš”. πŸ“¦

  • 이 μƒμžμ— 값을 넣어두면, μ–Έμ œλ“ μ§€ κΊΌλ‚΄μ„œ μ‚¬μš©ν•  수 μžˆμ–΄μš”.
  • ν•˜μ§€λ§Œ μƒμžμ— 물건을 λ„£κ³  빼도 μƒμžλŠ” λ³€ν•˜μ§€ μ•Šμ•„μš”(λ Œλ”λ§μ΄ λ‹€μ‹œ μΌμ–΄λ‚˜μ§€ μ•Šμ•„μš”).

Reactμ—μ„œ **useRef**λŠ” 이런 μƒμžμ™€ 같은 역할을 ν•΄μš”!
값을 μ €μž₯ν•΄λ‘μ§€λ§Œ 화면에 영ν–₯을 μ£Όμ§€ μ•Šκ³ , ν•„μš”ν•  λ•Œ κΊΌλ‚΄ μ“Έ 수 있죠.

 

πŸ› οΈ useRefλ₯Ό μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œ

1. DOM μš”μ†Œμ— μ ‘κ·Όν•˜κΈ°

useRefλ₯Ό μ‚¬μš©ν•˜λ©΄ HTML μš”μ†Œμ— 직접 μ ‘κ·Όν•  수 μžˆμ–΄μš”. 예λ₯Ό λ“€μ–΄ μž…λ ₯창에 포컀슀λ₯Ό μ£ΌλŠ” κΈ°λŠ₯을 λ§Œλ“€μ–΄λ³ΌκΉŒμš”?

import React, { useRef } from "react";

function FocusInput() {
  const inputRef = useRef(null); // useRef둜 μ°Έμ‘° 생성

  const handleFocus = () => {
    inputRef.current.focus(); // input μš”μ†Œμ— 포컀슀 μ£ΌκΈ°
  };

  return (
    <div>
      <h3>useRef둜 μž…λ ₯창에 포컀슀 μ£ΌκΈ°</h3>
      <input ref={inputRef} type="text" placeholder="여기에 μž…λ ₯ν•˜μ„Έμš”" />
      <button onClick={handleFocus}>포컀슀 주기</button>
    </div>
  );
}

export default FocusInput;

πŸ” μ½”λ“œ μ„€λͺ…

  1. useRef둜 μ°Έμ‘° 생성
    • const inputRef = useRef(null)λ₯Ό μ‚¬μš©ν•΄ input μš”μ†Œλ₯Ό μ°Έμ‘°ν•  μ€€λΉ„λ₯Ό ν•΄μš”.
  2. ref 속성 μ—°κ²°
    • <input ref={inputRef} />λ₯Ό μ‚¬μš©ν•΄ input μš”μ†Œμ™€ useRefλ₯Ό μ—°κ²°ν•΄ μ€λ‹ˆλ‹€.
  3. μš”μ†Œμ— μ ‘κ·Ό
    • inputRef.currentλ₯Ό μ‚¬μš©ν•˜λ©΄ μ‹€μ œ input DOM μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆμ–΄μš”.
    • focus() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ μž…λ ₯창에 포컀슀λ₯Ό μ£ΌλŠ” κΈ°λŠ₯을 λ§Œλ“€μ—ˆμ–΄μš”.

πŸ“ κ²°κ³Ό

  1. μž…λ ₯창에 값을 μ“°μ§€ μ•Šκ³  λ²„νŠΌλ§Œ λˆŒλŸ¬λ³΄μ„Έμš”.
  2. λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ μž…λ ₯창에 ν¬μ»€μŠ€κ°€ μ΄λ™ν•©λ‹ˆλ‹€! 🎯

 

2. κ°’ μ €μž₯ν•˜κΈ° (λ Œλ”λ§ 없이 κ°’ 관리)

useRefλŠ” 화면을 λ‹€μ‹œ λ Œλ”λ§ν•˜μ§€ μ•Šκ³ λ„ 값을 μ €μž₯ν•  수 μžˆμ–΄μš”.
이λ₯Ό ν™œμš©ν•˜λ©΄ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•˜κ±°λ‚˜ 타이머 같은 것을 λ§Œλ“€ λ•Œ μœ μš©ν•΄μš”.

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

function Timer() {
  const [count, setCount] = useState(0);
  const timerRef = useRef(null); // 타이머 IDλ₯Ό μ €μž₯

  const startTimer = () => {
    if (!timerRef.current) {
      timerRef.current = setInterval(() => {
        setCount((prev) => prev + 1);
      }, 1000); // 1μ΄ˆλ§ˆλ‹€ count 증가
    }
  };

  const stopTimer = () => {
    clearInterval(timerRef.current);
    timerRef.current = null; // 타이머 μ΄ˆκΈ°ν™”
  };

  return (
    <div>
      <h3>useRef둜 타이머 λ§Œλ“€κΈ°</h3>
      <p>카운트: {count}</p>
      <button onClick={startTimer}>타이머 μ‹œμž‘</button>
      <button onClick={stopTimer}>타이머 μ •μ§€</button>
    </div>
  );
}

export default Timer;

πŸ” μ½”λ“œ μ„€λͺ…

  1. useRef둜 타이머 ID μ €μž₯
    • timerRefλŠ” ν™”λ©΄κ³ΌλŠ” 상관없이 타이머 IDλ₯Ό μ €μž₯ν•˜λŠ” 역할을 ν•΄μš”.
  2. ν™”λ©΄ λ Œλ”λ§ 없이 κ°’ μœ μ§€
    • 타이머가 μ‹€ν–‰λ˜λ„ timerRef κ°’λ§Œ 변경될 뿐, 화면이 λ‹€μ‹œ λ Œλ”λ§λ˜μ§€ μ•Šμ•„μš”.
  3. μ •μ§€ λ²„νŠΌ
    • 타이머λ₯Ό μ •μ§€ν•˜λ©΄ clearInterval을 μ‚¬μš©ν•΄ 타이머λ₯Ό λ©ˆμΆ”κ³  timerRefλ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

 

πŸš€ useRef의 핡심 포인트!

  1. DOM μš”μ†Œμ— μ ‘κ·Ό
    • input, button, div 같은 HTML μš”μ†Œμ— μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•΄μš”.
  2. ν™”λ©΄ λ Œλ”λ§ 없이 κ°’ 관리
    • 값이 λ°”λ€Œμ–΄λ„ μ»΄ν¬λ„ŒνŠΈκ°€ λ‹€μ‹œ λ Œλ”λ§λ˜μ§€ μ•Šμ•„μš”.
  3. νƒ€μ΄λ¨Έλ‚˜ λ³€μˆ˜ μ €μž₯
    • 타이머 ID, 이전 μƒνƒœκ°’ 등을 μ €μž₯ν•˜κ³  관리할 λ•Œ μœ μš©ν•΄μš”.

 

🌟 μ •λ¦¬ν•˜μžλ©΄!

useRefλŠ” DOM μš”μ†Œμ— μ ‘κ·Όν•˜κ±°λ‚˜ ν™”λ©΄ λ Œλ”λ§κ³Ό 상관없이 값을 μ €μž₯ν•˜κ³  관리할 수 μžˆλŠ” React ν›…μ΄μ—μš”.
화면이 λ‹€μ‹œ κ·Έλ €μ§€μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” μƒν™©μ—μ„œ μ•„μ£Ό μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€!

728x90
λ°˜μ‘ν˜•