ν‹°μŠ€ν† λ¦¬ λ·°

web/react hook

useRef

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
λ°˜μ‘ν˜•

'web > react hook' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

useSyncExternalStore  (1) 2024.12.14
useState  (0) 2024.12.14
useReducer  (0) 2024.12.14
useOptimistic  (0) 2024.12.14
useMemo  (2) 2024.12.14
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2025/01   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
κΈ€ 보관함
λ°˜μ‘ν˜•
250x250