useRef는 내용이 변경될 때 그것을 알려주지는 않는다는 것을 유념하세요. .current 프로퍼티를 변형하는 것이 리렌더링을 발생시키지는 않습니다. React가 DOM 노드에 ref를 attach하거나 detach할 때 어떤 코드를 실행하고 싶다면 대신 콜백 ref를 사용하세요.
useRef
useRef의 용도
- DOM 선택
-
컴포넌트 안에서 조회 및 수정할 수 있는 변수를 관리하는 것 => useRef로 관리하는 변수는 값이 바뀐다고 해서 컴포넌트가 리렌더링 되지 않음 => 리렌더링 없이 변수값의 변화를 이용할 때 사용할 수 있다
const nextId = useRef(4); const onCreate = () => { // 나중에 구현 할 배열에 항목 추가하는 로직 // ... nextId.current += 1; };
const refContainer = useRef(initialValue);
Callback Ref
- Ref는 포커스, 텍스트 선택 영역, 미디어 재생 등 DOM에 직접적으로 접근하거나, 애니메이션을 직접적으로 실행시킬 때 사용
- ref 어트리뷰트에
React.createRef()
를 통해 생성된 ref 를 전달하는 대신 함수를 전달함 - ref 콜백은 컴포넌트의 인스턴스가 마운트될 때 DOM 엘리먼트와 함께 호출
- 컴포넌트 인스턴스의 마운트가 해제될 때 ref 콜백을 null과 함께 호출
- 콜백 ref를 사용하면 child component가 DOM 객체나 ref로 받고있는 뭔가를 늦게 생성해도 (다 마운트 된 후에 클릭 이벤트에 반응한다던가 데이터를 받아온다던가…) 그것을 알아차리고 업데이트할 수 있다!
<input
type="text"
ref={this.setTextInputRef}
/>
constructor(props) {
super(props);
this.textInput = null;
this.setTextInputRef = element => {
this.textInput = element;
};
this.focusTextInput = () => {
// DOM API를 사용하여 text 타입의 input 엘리먼트를 포커스합니다.
if (this.textInput) this.textInput.focus();
};
}
정리
- current 프로퍼티에 변경 가능한 값을 담고 있다
-
useRef는 매번 렌더링 시 동일한 ref 객체를 제공함 ⇒ 내용이 변경될 때 그것을 알려주지는 않는다!
- .current 프로퍼티를 변경한다고 리렌더링 발생 X
- DOM 노드에 ref를 attach / detach 할 때 실행하고 싶은게 있다면 콜백 ref를 사용해야!!
- 어떤건지 이해하는 거랑 실제로 적재적소에 쓸 줄 아는 건 너무나 다른듯,,, 많이 배워야 한다,,,쿄쿄