useRef()

1. κ°œμš”

μžλ°”μŠ€ν¬λ¦½νŠΈμ„ μ‚¬μš©ν•  λ•Œ νŠΉμ • DOM에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ” getElementById, querySelector와 같은 DOM Selector ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ λ¦¬μ•‘νŠΈμ—μ„œλŠ” μ–΄λ–€ λ°©λ²•μœΌλ‘œ DOM에 μ ‘κ·Όν•  수 μžˆμ„κΉŒ? λ°”λ‘œ useRef()훅을 μ΄μš©ν•˜λ©΄ λœλ‹€.


2. useRef() 둜 νŠΉμ • DOM μ„ νƒν•˜κΈ°

λ¨Όμ € useRef()λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • DOM을 μ„ νƒν•˜μž. μš°μ„ μ μœΌλ‘œ ν•  일은 useRef()λ₯Ό λ¦¬μ•‘νŠΈμ—μ„œ μž„ν¬νŠΈν•œ ν›„ Ref 객체λ₯Ό λ§Œλ“œλŠ” 일이닀. κ·Έ ν›„ Ref 객체λ₯Ό μš°λ¦¬κ°€ μ„ νƒν•˜κ³  싢은 DOM에 refκ°’μœΌλ‘œ μ„€μ •ν•΄μ•Ό ν•œλ‹€.

μ•„λž˜μ˜ μ˜ˆμ‹œλ₯Ό ν•¨κ»˜ 보자.

import React, { useRef } from "react";

const Test = () => {
  const nameRef = useRef();
  const emailRef = useRef();

  console.log(nameRef, emailRef);

  return (
    <div>
      <div>
        <input ref={nameRef} type="text" placeholder="이름을 μž…λ ₯ν•˜μ„Έμš”." />
        <button>name focus</button>
      </div>
      <div>
        <input ref={emailRef} type="text" placeholder="이메일을 μž…λ ₯ν•˜μ„Έμš”." />
        <button>email focus</button>
      </div>
    </div>
  );
};

export default Test;

useRef()λ₯Ό 톡해 λ‘κ°œμ˜ Ref 객체λ₯Ό λ§Œλ“€μ—ˆλ‹€. ν•˜λ‚˜λŠ” nameRef이고 λ‹€λ₯Έ ν•˜λ‚˜λŠ” emailRef이닀. κ·Έ ν›„ 각각 input의 ref κ°’μœΌλ‘œ μ„€μ •ν–ˆλ‹€. μ½˜μ†”λ‘œ μ–΄λ–€ λ‚΄μš©μ΄ μ°νžˆλŠ”μ§€ 보자.

useRef()
useRef()

Ref 객체의 .current 값은 μš°λ¦¬κ°€ μ›ν•˜λŠ” DOMλ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€.

μ’€ 더 λ‚˜μ•„κ°€ inputμ˜†μ— μœ„μΉ˜ν•œ λ²„νŠΌμ„ λˆ„λ₯Ό λ•Œ 각각의 input에 focusλ₯Ό 주도둝 ν•΄λ³΄μž. κ·Έλ ‡λ‹€λ©΄ μ•„λž˜μ˜ 좔가적인 μ½”λ“œ(λ²„νŠΌμ˜ onClick) μž‘μ„±μ΄ ν•„μš”ν•˜λ‹€.

.current.focus()을 톡해 input에 focusλ₯Ό 쀄 수 μžˆλ‹€. 클릭을 톡해 확인해 보면 μ•„λž˜μ˜ 사진과 κ°™λ‹€. μ•„λž˜λŠ” email focus λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œμ˜ λͺ¨μŠ΅μ΄λ‹€.

focus

3. useRef() 둜 λ³€μˆ˜ κ΄€λ¦¬ν•˜κΈ°

useRef()λŠ” DOMλ₯Ό μ„ νƒν•˜λŠ” μš©λ„ 외에도, μ»΄ν¬λ„ŒνŠΈ μ•ˆμ—μ„œ 쑰회 및 μˆ˜μ •ν•  수 μžˆλŠ” λ³€μˆ˜λ₯Ό 관리할 수 μžˆλ‹€.

λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈλŠ” useState()둜 μ„ μ–Έλœ λ³€μˆ˜(데이터)κ°€ λ³€ν•  λ•Œ λ§ˆλ‹€ λ¦¬λžœλ”λ§μ„ ν•˜κ²Œ λ˜λ©΄μ„œ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€ λ³€μˆ˜λ“€μ΄ μ΄ˆκΈ°ν™”λœλ‹€. μ•„λž˜μ˜ μ˜ˆμ‹œ μ½”λ“œλ₯Ό λ³΄λ©΄μ„œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ΄ν•΄ν•΄λ³΄μž.

useRef - useState

λ³€μˆ˜ numberλŠ” varλ₯Ό 톡해 선언이 λ˜μ—ˆκ³  아무리 +λ²„νŠΌμ„ λˆ„λ₯Έλ‹€ 해도 화면이 λ‹€μ‹œ λžœλ”λ§μ΄ λ˜μ§€λŠ” μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ μ½˜μ†”μ„ μ°μ—ˆμ„ λ•Œ μ½”λ“œ λ‚΄λΆ€μ—μ„œλŠ” μˆ«μžκ°€ ν•˜λ‚˜μ”© 였λ₯΄λŠ” 것을 확인할 수 μžˆλ‹€. κ·Έλ ‡λ‹€λ©΄ κ·Έ μ•„λž˜μ˜ λžœλ”λ§ λ²„νŠΌμ„ λˆŒλ €μ„ 땐 μ–΄λ–¨κΉŒ? number의 값이 μ΄ˆκΈ°ν™” λ˜μ–΄ λ‹€μ‹œ 0이 λœλ‹€.

μ΄λ²ˆμ—λŠ” varκ°€ μ•„λ‹Œ useRef()λ₯Ό 톡해 λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•΄λ³΄μž. μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μž.

μœ„μ™€ 같이 var둜 μ„ μ–Έν•œ numberλ₯Ό useRef()둜 λ°”κΎΈμ—ˆκ³  useRef()의 ()μ•ˆμ— νŒŒλΌλ―Έν„°λ‘œ 0을 λ„£μ–΄ μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜μ˜€λ‹€. 그리고 number.currentλ₯Ό 톡해 값을 μ‘°νšŒν•œλ‹€. λ˜ν•œ +λ²„νŠΌμ„ λˆ„λ₯Ό λ•Œ λ§ˆλ‹€ number.current의 값을 μˆ˜μ •ν•˜μ—¬ 1μ”© 값을 μ¦κ°€μ‹œν‚€κ²Œ ν•˜μ˜€λ‹€. κ·Έ κ²°κ³ΌλŠ” μ•„λž˜μ˜ 사진과 κ°™λ‹€.

useRef - useState 2

이전 var둜 μ„ μ–Έν–ˆμ„ λ•Œ 처럼 +λ²„νŠΌμ„ λˆ„λ₯Ό 땐 number값이 1μ”© μ¦κ°€ν•˜μ§€λ§Œ μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λžœλ”λ§ λ˜μ—ˆμ„ 땐 이전과 λ‹€λ₯΄κ²Œ number값이 0으둜 μ΄ˆκΈ°ν™”κ°€ λ˜μ§€ μ•ŠλŠ” 것을 확인할 수 μžˆλ‹€.

μ—¬κΈ°μ„œ μ•Œ 수 μžˆλŠ” ν•˜λ‚˜μ˜ 사싀은 useRef()둜 μ„ μ–Έλœ λ³€μˆ˜μ˜ 값이 λ³€ν•˜λ”λΌκ³  μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λžœλ”λ§λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것이닀. 즉, μœ„μ˜ μ‚¬μ§„μ—μ„œλŠ” Number: 8이라고 λ˜μ–΄μžˆμ§€λ§Œ μ΄λŠ” λžœλ”λ§ λ²„νŠΌμœΌλ‘œ 인해 μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λžœλ”λ§μ΄ λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄κ³  κ·Έ μ „κΉŒμ§€λŠ” μˆ˜μ •λœ number의 값을 ν™”λ©΄μ—μ„œλŠ” λ³Ό 수 μ—†λ‹€. μ•„λž˜μ˜ 사진을 μ°Έκ³ ν•˜λΌ!

useRef - useState 3

4. Conclusion

useRef()λ₯Ό 톡해 DOM에 직접 μ ‘κ·Όν•˜κ³  μž‘μ—…ν•˜λŠ” 과정은 특히 inputλ₯Ό λ‹€λ£° λ•Œ λͺ‡ 번 μ‚¬μš©ν–ˆμ—ˆλ‹€. ν•˜μ§€λ§Œ useRef()λ₯Ό 톡해 λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•˜λŠ” 것은 ν•œ λ²ˆλ„ 해보지 λͺ»ν•˜μ˜€λ‹€. var둜 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  κ΄€λ¦¬ν•˜λŠ” κ²ƒκ³Όμ˜ μ°¨μ΄λŠ” 이해가 λ˜μ§€λ§Œ μ–΄λ–€ κΈ°λŠ₯μ—μ„œ useRef()λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” 아직 μ˜λ¬Έμ΄λ‹€. ꡬ체적인 μ˜ˆμ‹œμ™€ useRef()λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•˜λŠ” μž₯점에 λŒ€ν•΄ μ•Œμ•„λ³΄κ³  μ‹Άλ‹€.(이후 κ³΅λΆ€ν•˜λ‹€κ°€ ν•΄λ‹Ή λ‚΄μš©μ΄ λ‚˜μ˜€λ©΄ useRef()챕터에 정리λ₯Ό ν•΄μ•Όκ² λ‹€.)


μ°Έκ³ 

ko.reactjs.org - useRef 10. useRef 둜 νŠΉμ • DOM μ„ νƒν•˜κΈ° [React] useRef μ‚¬μš©λ²• 및 예제


πŸ‘†

πŸ“… 2022-08-01

Last updated