![[React] useRef](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqM8Ai%2FbtsGkAtftIa%2F37Wp78HlphethCq4bEMggK%2Fimg.png)
π useRefλ 무μμΈκ°μ?
useRef
λ 리μ‘νΈ ν
μ€ νλλ‘, λ³κ²½ κ°λ₯ν ref κ°μ²΄λ₯Ό λ°νν΄μ. μ΄ ref κ°μ²΄λ .current
μμ±μ κ°μ§κ³ μμ΄μ. κ°μ₯ νν μ¬μ© μλ DOM μμμ μ§μ μ κ·Όνλ κ²μ΄μ§λ§, κ°μ΄ λ³κ²½λμ΄λ μ»΄ν¬λνΈκ° μ¬λ λλ§λμ§ μλ λ³μλ₯Ό μ μ₯νλ λ°μλ μ¬μ©ν μ μμ΄μ.
μ¬λ¬λΆμ΄ ν° λμκ΄μ μλ€κ³ μμν΄ λ³΄μΈμ. μ΄ λμκ΄μλ μλ§μ μ±
λ€μ΄ μκ³ , κ°κ°μ μ±
μ νΉμ ν μμΉμ μμ΄μ. μ¬κΈ°μ 'μ±
'μ DOM μμλ μ»΄ν¬λνΈλ₯Ό λννκ³ , 'μ±
μ μμΉ'λ κ·Έ μμλ μ»΄ν¬λνΈμ λν μ°Έμ‘°(Reference)λ₯Ό μμ§ν΄μ. useRef
λ λ§μΉ μ±
κ°νΌμ²λΌ νΉμ ν μ±
(μμ/μ»΄ν¬λνΈ)μ μ½κ² μ°Ύμκ° μ μλ λ°©λ²μ μ 곡ν΄μ. μ¬λ¬λΆμ΄ κ·Έ μ±
κ°νΌλ₯Ό κ°μ§κ³ μλ€λ©΄, λμκ΄ μ΄λμλ κ·Έ μ±
μ λΉ λ₯΄κ² μ°Ύμκ° μ μμ΄μ.
π₯οΈ useRef μ¬μ© μμ
1. DOM μμμ μ κ·ΌνκΈ°
import React, { useRef } from 'react';
function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
// 'current'λ input μμλ₯Ό κ°λ¦¬ν΅λλ€.
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>
);
}
μ΄ μμμμ useRefλ νΉμ μ λ ₯ νλμ μ§μ μ κ·Όνλ λ° μ¬μ©λ©λλ€. inputElμ input μμλ₯Ό μ°Έμ‘°νκ³ , λ²νΌ ν΄λ¦ μ ν΄λΉ μμμ μλμΌλ‘ ν¬μ»€μ€λ₯Ό λ§μΆ₯λλ€. μ΄λ DOM μμμ μ§μ μ μΌλ‘ μμ ν νμκ° μμ λ λ§€μ° μ μ©ν©λλ€.
2. κ° μ μ₯νκΈ°
import React, { useRef, useEffect } from 'react';
function TimerComponent() {
const count = useRef(0);
useEffect(() => {
setInterval(() => {
count.current += 1;
}, 1000);
}, []);
return <p>Timer: {count.current}</p>;
}
μ΄ μμμμ useRefλ μ»΄ν¬λνΈ λΌμ΄νμ¬μ΄ν΄ λμ λ³κ²½λμ§ μλ κ°μ μ μ§νλ λ° μ¬μ©λ©λλ€. countλ νμ΄λ¨Έμ μΉ΄μ΄νΈλ₯Ό μ μ₯νλ©°, μ΄ κ°μ μ»΄ν¬λνΈμ λ€μ λ λλ§μ μν₯μ μ£Όμ§ μμΌλ©΄μλ κ° λ λλ§ κ°μ μ μ§λ©λλ€. μ΄λ μλ₯Ό λ€μ΄ νμ΄λ¨Έ, μ λλ©μ΄μ λ±μμ μ μ©νκ² μ¬μ©λ μ μμ΄μ.
π€ useRef vs useState
리μ‘νΈμμ useRef
μ useState
λ λͺ¨λ μ»΄ν¬λνΈμ μνλ₯Ό κ΄λ¦¬νλ λ° μ¬μ©λμ§λ§, λͺ κ°μ§ μ€μν μ°¨μ΄μ μ΄ μμ΄μ:
1. λ λλ§ νΈλ¦¬κ±°
- useState:
useState
λ₯Ό μ¬μ©νμ¬ μνλ₯Ό μ λ°μ΄νΈνλ©΄ μ»΄ν¬λνΈκ° μ¬λ λλ§λΌμ. μ΄λ μνκ° UIμ μ§μ μ μΌλ‘ μν₯μ λ―ΈμΉ λ μ μ©ν΄μ. - useRef:
useRef
λ‘ μμ±λ κ°μ²΄μ.current
μμ±μ λ³κ²½ν΄λ μ»΄ν¬λνΈμ μ¬λ λλ§μ΄ νΈλ¦¬κ±° λμ§ μμμ. μ΄λ λ λλ§ μ¬μ΄ν΄κ³Ό 무κ΄ν κ°μ μ μ₯νλ λ° μ ν©ν΄μ.
2. μ¬μ© λͺ©μ
- useState: μ£Όλ‘ μ»΄ν¬λνΈμ λμ μΈ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ λ° μ¬μ©λΌμ. μλ₯Ό λ€μ΄, μ¬μ©μ μ λ ₯, μλ² μλ΅ λ± UIμ λ°μλμ΄μΌ νλ λ°μ΄ν°μ μ ν©ν΄μ.
- useRef: μ£Όλ‘ DOM μμμ μ κ·Όνκ±°λ, λ λλ§ μ¬μ΄ν΄μ μν₯μ μ£Όμ§ μλ κ°μ μ μ₯νλ λ° μ¬μ©λΌμ. μλ₯Ό λ€μ΄, νμ΄λ¨Έ ID, μ΄μ μν κ° λ±μ μ¬μ©λΌμ.
3. μ¬μ© μμ μ½λ
useState
λ μν λ³κ²½κ³Ό UI μ λ°μ΄νΈμ μ ν©νκ³ ,useRef
λ DOM μ κ·Όμ΄λ λ λλ§κ³Ό 무κ΄ν κ°μ μ μ₯μ μ μ©ν΄μ.
// useState μμ : μν μ
λ°μ΄νΈμ μ»΄ν¬λνΈ μ¬λ λλ§
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1); // μν μ
λ°μ΄νΈ
};
return (
<div>
<p>Count: {count}</p>
<button onClick={handleClick}>Increase</button>
</div>
);
}
μ΄ μμ μμ count μνκ° λ³κ²½λ λλ§λ€ Counter μ»΄ν¬λνΈλ μ¬λ λλ§λ©λλ€. μ΄λ UIκ° νμ μ΅μ μνλ₯Ό λ°μνλλ‘ ν©λλ€.
// useRef μμ : DOM μμ μ κ·Ό λ° λ λλ§ μ¬μ΄ν΄κ³Ό 무κ΄ν κ° μ μ₯
import React, { useRef, useEffect } from 'react';
function Timer() {
const intervalRef = useRef();
const count = useRef(0);
useEffect(() => {
intervalRef.current = setInterval(() => {
count.current += 1;
console.log(`Timer: ${count.current}`);
}, 1000);
return () => clearInterval(intervalRef.current);
}, []);
return <p>Check the console for timer updates.</p>;
}
μ΄ μμ μμ intervalRefλ νμ΄λ¨Έ IDλ₯Ό μ μ₯νκ³ , countλ νμ΄λ¨Έμ μΉ΄μ΄νΈλ₯Ό μ μ₯ν©λλ€. count.currentμ λ³κ²½μ μ»΄ν¬λνΈμ μ¬λ λλ§μ νΈλ¦¬κ±°νμ§ μμΌλ©°, UIμ μ§μ μ μΌλ‘ λ°μλμ§ μμ΅λλ€.
π¨ μ£Όμν μ
useRef
λ‘ μμ±λ κ°μ²΄λ 리μ‘νΈμ λ°μ΄ν° νλ¦ μΈλΆμ μ‘΄μ¬νκΈ° λλ¬Έμ, .current
μμ±μ λ³κ²½ν΄λ μ»΄ν¬λνΈκ° μ¬λ λλ§λμ§ μμμ.
λ, DOM μμμ μ κ·Όν λλ μ»΄ν¬λνΈκ° λ§μ΄νΈ λ νμλ§ ref κ°μ²΄κ° μ ν¨νλ―λ‘, νμ null 체ν¬λ₯Ό ν΄μΌ ν©λλ€.
π κ²°λ‘
useRef
λ 리μ‘νΈμμ DOM μμμ μ κ·Όνκ±°λ, λ λλ§κ³Ό 무κ΄ν λ°μ΄ν°λ₯Ό μ μ₯νλ λ° λ§€μ° μ μ©ν ν
μ΄μμ. μ΄λ₯Ό ν΅ν΄ λ λ€μν μνΈμμ©κ³Ό μ±λ₯ μ΅μ νλ₯Ό ꡬνν μ μμ΄μ.
π μΆκ° μ 보
- 리μ‘νΈμ
useRef
μ λν λ κΉμ μ΄ν΄λ₯Ό μνμ λ€λ©΄, 리μ‘νΈ κ³΅μ λ¬Έμμμ μμΈν μ 보λ₯Ό μ°Ύμλ³Ό μ μμ΄μ.
'Front-end > React' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[React] μλͺ μ£ΌκΈ° (0) | 2024.10.20 |
---|---|
[React] JSX (0) | 2024.10.19 |
[React] useEffect (0) | 2024.04.04 |
[React] State (1) | 2024.01.08 |
ν¬μ€ν μ΄ μ’μλ€λ©΄ "μ’μμβ€οΈ" λλ "ꡬλ ππ»" ν΄μ£ΌμΈμ!