리액트에서 Ref는 그냥 참조를 의미한다. (reference의 준말)
- ref의 가장 기본적인 기능은 다른 DOM 요소에 접근해 그것들로 작업할 수 있게 해주는 기능이다.
- HTML 작성 시 DOM요소에 이름을 달 경우 id를 사용한다. 이처럼 리액트에서도 DOM을 직접 접근하기 위한 방법이 있는데 이를 ref라고 부른다.
// App.js
import { useRef } from 'react';
function App() {
const inputEl = useRef(null);
const onButtonClick = (e) => {
e.preventDefault();
console.log(inputEl);
};
return (
<form>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>보내기</button>
</form>
);
}
export default App;
Javascript에서 querySelector
, getElementById
같은 DOM API를 리액트에서도 가끔씩 사용을 해줘야 할 때가 있다 (스크롤바 위치 가져오기, 포커스 설정 등). 그럴 때 useRef
Hook 함수를 사용한다.
// App.js
import { useEffect, useRef } from 'react';
const App = () => {
const inputRef = useRef();
useEffect(() => {
inputRef.current.focus();
}, []);
const greetHandler = () => {
alert(`안녕하세요. ${inputRef.current.value}님`);
};
return (
<div>
<input type="text" placeholder="사용자 이름" ref={inputRef} />
<button onClick={greetHandler}>로그인</button>
</div>
);
};
export default App;
예) input 태그에서 사용자가 입력한 내용일 관리할 때 state로 관리하는 방법이 있다. 하지만 state로 관리를 하면 매번 키를 누를 때마다 사용자로부터 얻은 값을 업데이트하고, 그것을 state에 저장하고 그 state를 input에 다시 공급한다. 그리고 나중에 그 state를 사용해 인풋을 재설정하고 데이터가 필요한 곳으로 보내기도 한다.
물론 이 방법이 나쁜것은 아니지만 폼 태그에서 제출할 때만 필요한 경우에는 좀 과한 프로세스로 느껴진다. 이 경우 ref를 사용할 수가 있다.