- target DOM nodes/elements
- DOES NOT trigger re-render
- Imperative
Life cycle
ref는 componentDidMount나 useEffect가 실행되기 전에 할당됩니다.
컴포넌트가 마운트 될 때 할당되며, 언마운트 될 때 Null을 할당합니다.
리액트 컴포넌트 혹은 DOM 조작이 가능해진다.
ref를 통해 DOM 객체에 대한 참조 주소를 반환받는다.
const inputRef = useRef<HTMLInputElement>(null);
// ref객체 (plain JS object) 초기화
// {current: null}
return <input type="text" ref={inputRef} />
// Ref 객체를 target DOM의 ref 속성 값으로 설정
...
console.log(refContainer.current); // <input type="text">
공식문서에서 권장하는 Ref의 바람직한 사용 사례는 다음과 같다.
대부분 경우에 React에서 폼을 구현하는데 제어 컴포넌트를 사용하는 것이 좋습니다.
const [state, setState] = useState("");
...
const handleChange = (event) => {
setState(event.target.value);
}
const handleSubmit = (event) => {
event.preventDefault();
console.log(state);
}
...
<form className="form" onSubmit={handleSubmit}>
<input type="text" value={state} onChange={handleChange}>
</form>
useEffect(() => {
refContainer.current.focus();
});
...
<input type="text" ref={refContainer} />
선언적으로 해결될 수 있는 문제에서는 ref 사용을 지양하세요.
예를 들어, Dialog 컴포넌트에서 open()과 close() 메서드를 두는 대신, isOpen이라는 prop을 넘겨주세요.
ref.current.focus()
// focus하는 기능을 명령적으로 명시