useCallbackRef
type Ref<T> =
| RefCallback<T>
| RefObject<T>
| null;useRef가 반환한ref는 내용이 변경(ref.current = value)되더라도 리렌더링을 발생시키지 않는 특징을 갖는다.JSX Element(ex.
<div>)에ref를 전달하면 컴포넌트가 렌더링된 이후 해당 DOM 노드에 대한 참조를ref.current에 할당해주는 역할을 수행한다.만약 해당 요소가 unmount된다면
ref.current에 할당된 값을null로 변경해주는 동작을 수행한다.
<input
ref={(node) => {
ref.current = node;
}}
/>즉,
Ref의 타입에서도 알 수 있듯이 기본적으로는RefObject를 전달한 경우 위와 같은 문법적 설탕(Syntatic Sugar)을 제공한다고 생각할 수 있다.이때 리액트는 동일한 참조를 갖는
ref를 전달한 경우ref에 전달한 함수를 다시 실행하지 않게된다.
const ref = useCallback((node) => {
node.focus();
}, []);
<input ref={ref} />따라서
useCallback에 빈 의존성 배열(deps)을 전달해 만든RefCallback을 전달하게 된다면 DOM 노드가 렌더링된 이후에 최초 한 번만 실행되게끔 구현하는 것이 가능하다.일반적이지는 않지만
ref.current가 변경될 때마다 특정한 동작을 수행하게끔 하고 싶다면useCallbackRef를 사용하면 된다.이전 값과 새로운 값이 동일하다면 전달한
callback은 실행되지 않는다.useRef대신useState를 이용해 생성한 상태(ref)를 활용하므로 의존성 배열에 전달하면 변경될 때마다 반응하게끔 할 수 있게 된다.
Implementation
참고 자료
Last updated