함수형 컴포넌트에서 선언된 변수들은 렌더링 될 때마다 다시 생성된다. 해당 변수가 함수를 참조하고 있어도 동일하다. 그럼 렌더링과 관계 없이 유지하고 >싶은 변수는 어떻게 해야할까?
ref는 컴포넌트가 DOM 노드나 timeout ID와 같이 렌더링에 사용되지 않는 일부 정보를 보유할 수 있게 해준다. state와 달리 ref를 업데이트해도 컴포넌트가 다시 렌더링되지는 않는다. ref는 React 패러다임에서 “탈출구”다. 브라우저 빌트인 API와 같이 React가 아닌 시스템에서 작업해야 할 때 유용하다.
const ref = useRef(0); //0 초기값
console.log(ref.current) // 0
current
속성을 읽고 수정할 수 있는 일반 JavaScript 객체React는 ref.current
가 언제 변경되는지 알지 못해서, 렌더링 중에 읽어도 컴포넌트의 동작을 예측하기 어렵다. 렌더링 중에 사용하는 정보는 state를 쓰자.
React는 렌더링 출력과 일치하도록 DOM을 자동으로 업데이트하므로 컴포넌트가 자주 조작할 필요가 없다.
하지만 때로는 노드에 초점을 맞추거나 스크롤하거나 크기와 위치를 측정하기 위해 React가 관리하는 DOM 요소에 접근해야 할 때가 있는데 이때 ref를 사용한다.
import { useRef } from 'react';
export default function Form() {
const inputRef = useRef(null);
function handleClick() {
inputRef.current.focus();
}
return (
<>
<input ref={inputRef} />
<button onClick={handleClick}>
Focus the input
</button>
</>
);
}
forwardRef
를 사용하고 두 번째 ref
인수를 특정 노드에 전달하여 DOM 노드를 노출하도록 설정할 수 있다.import { forwardRef, useRef } from 'react';
const MyInput = forwardRef((props, ref) => {
return <input {...props} ref={ref} />;
});
export default function Form() {
const inputRef = useRef(null);
function handleClick() {
inputRef.current.focus();
}
return (
<>
<MyInput ref={inputRef} />
<button onClick={handleClick}>
Focus the input
</button>
</>
);
}
컴포넌트에서 렌더링 로직에 영향을 미치지 않는 값을 저장하고자 할 때
refs | state |
---|---|
useRef(initialValue) 는 { current: initialValue } 을 반환 | useState(initialValue) 는 state 변수의 현재값과 state 설정자함수([value, setValue] )를 반환 |
변경 시 리렌더링을 촉발하지 않음 | 변경 시 리렌더링을 촉발함 |
Mutable— 렌더링 프로세스 외부에서 current 값을 수정하고 업데이트할 수 있음 | “Immutable”— state setting 함수를 사용하여 state 변수를 수정해 리렌더링을 대기열에 추가해야함 |
렌더링 중에는 current 값을 읽거나 쓰지 않아야 함 | 언제든지 state를 읽을 수 있음. 각 렌더링에는 변경되지 않는 자체 state snapshot이 있음 |
💡 대답할 수 있나요?
useRef가 무엇인가요?
ref와 state의 차이는 무엇인가요?
Ref의 용도는 무엇인가요?
이 글은 React 공식문서를 참고하였습니다.
정리 굿이네요 잘 보고 갑니다잉