.current
프로퍼티로 전달된 인자(initialValue)로 초기화된 변경 가능한 ref 객체를 반환한다. 반환된 객체는 컴포넌트의 전 생애주기를 통해 유지 됨1. Immutable Reference
.current
속성을 변경할 수 있지만 useRef
자체는 불변함, 이는 컴포넌트가 다시 렌더링 되더라도 동일한 ref 객체를 반환한다.2. No Triggering Re-render
useRef
로 관리되는 값이 변경되어도 컴포넌트는 다시 렌더링 되지 않는다.3. Storing Mutable Variables
4. Access to DOM Nodes
// 임의의 값 저장
const countRef = useRef(0); // useRef를 호출해 ref 객체를 생성하고 초기값으로 0을 넣습니다.
countRef.current += 1; // '.current'로 현재 ref 값에 접근하고 변경합니다.
// DOM에 직접 접근
const inputRef = useRef(null); // useRef를 호출해 ref 객체를 생성합니다.
<input ref={inputRef} type="text" /> // 엘리먼트에 ref 객체를 연결합니다.
import React, { useState, useRef } from 'react';
const RefTest = () => {
const countRef = useRef(0); // useRef로 선언
let countVar = 0; // let으로 변수 선언
const [rendering, setRendering] = useState(0);
const increaseRef = () => {
countRef.current += 1;
console.log("Ref", countRef.current);
}
const increaseVar = () => {
countVar += 1;
console.log("Var", countVar);
}
const viewCount = () => {
console.log("Ref", countRef.current, "Var", countVar)
}
const doRendering = () => {
setRendering(rendering+1);
console.log('렌더링');
}
return (
<div>
<p>countRef : {countRef.current}</p>
<p>countVar : {countVar}</p>
<button onClick={increaseRef}>Ref 증가</button>
<button onClick={increaseVar}>Var 증가</button>
<button onClick={viewCount}>값 출력</button>
<button onClick={doRendering}>렌더링</button>
</div>
);
};
export default RefTest;
useRef와 변수 선언의 차이점
useRef
의 경우 버튼 클릭 시 값이 바뀌어도 재렌더링 되기 전까지는 화면에 출력되지 않는다. 재렌더링 시에는 초기화가 되지 않고 값이 화면에 출력되게 된다.
변수 선언
은 값이 증가하는 게 콘솔에 찍히지만 화면에는 보이지 않는다. 다만 재렌더링 시에는 초기화가 되어 변수의 경우 초기화가 됨
import React, { useRef } from 'react';
const RefTest = () => {
const inputRef = useRef();
const inputFouse = () => {
inputRef.current.focus();
console.log("input focus")
}
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={inputFouse}>input focus</button>
</div>
);
};
export default RefTest;
서로 비슷해보이지만 다르며, 상황에 따라 사용하면 된다.
useState
useRef
따라서 화면에 값이 변하는 게 보여야 한다면 useState
를 사용, 화면에 보이지 않으면서 값을 계속 유지해야 되는 경우엔 useRef
를 사용하면 된다.
useRef
가 반환하는 ref 객체의 .current 속성을 변경해도 컴포넌트는 재렌더링되지 않는다.useState
또는 useReducer
를 사용