Referencing Values with Refs
컴포넌트 렌더링 사이에서 계속 유지하려는 값은 state 대신 ref 객체에 저장하면 됩니다.
useRef
ref를 사용하려면 useRef
hook에 initial value를 인자로 전달하면 되고, ref.current
속성에 접근하여 read/write하면 됩니다.
jsx
import { useRef } from 'react';
const ref = useRef(0);
// initial value로는 모든 데이터 타입(심지어 함수까지)이 가능합니다.
// read
ref.current + ...;
// write
ref.current.~ = ~;
ref.current = {...};
useRef
의 hook에서 반환되는 값은 JS 객체이고 아래와 같은 특징을 가집니다.
- state와는 달리 새로운 객체로 할당되어도 컴포넌트 리렌더링을 trigger하지 않는다.
- 첫 렌더링 때만 초기화되고, 컴포넌트가 리렌더링되어도 이전 값을 유지한다.
ref는 컴포넌트 렌더링 주기의 영향없이(escape hatch) 외부 API(Browser API)를 사용할 수 있다는 점에서 아래 값들을 저장하는데 활용됩니다.
- unmount시 timer/interval을 clear하기 위한
setTimeout
,setInterval
id setTimeout
,setInterval
콜백에서 참조할 최신 state값- DOM element에 접근하기 위한 수단
- 반환되는 JSX를 계산하는데 필요하지 않은 데이터
WARNING
ref.current
값을 read/write하는 코드는 컴포넌트 렌더링 중 즉, 컴포넌트 함수의 context 상에 위치해서는 안됩니다.
state처럼 리렌더링을 trigger하지 않기 때문에 컴포넌트의 동작방식을 추적하는데 어려움을 주므로 보통 event handler에서 다룹니다.