1. 컴포넌트에 ref 추가하기
2. ref와 state의 차이점
3. ref를 사용해야 하는 경우
4. ref 모범 사례
5. Ref와 DOM
React에서 useRef
훅을 가져와서 컴포넌트에 ref를 추가할 수 있습니다:
import { useRef } from 'react';
컴포넌트 내부에서 useRef
훅을 호출하고 참조할 초기값을 인자로 전달하십시오. 예를 들어, 값 0
은 ref에 대한 초기값이다.
const ref = useRef(0);
useRef
는 다음과 같은 객체를 반환한다.
{
current: 0 // The value you passed to useRef
}
Illustrated by Rachel Lee Nabors
ref.current
속성을 통해 해당 ref의 현재 값에 액세스할 수 있다.
이 값은 의도적으로 변이 가능하므로 읽기와 쓰기가 모두 가능하다.
React가 추적하지 않는 컴포넌트의 비밀 주머니와 같다.
(이것이 바로 React의 단방향 데이터 흐름에서 “탈출구”가 되는 이유이다.)
여기서 버튼은 클릭할 때마다 ref.current
를 증가시킨다.
import { useRef } from 'react';
export default function Counter() {
let ref = useRef(0);
function handleClick() {
ref.current = ref.current + 1;
alert('You clicked ' + ref.current + ' times!');
}
return (
<button onClick={handleClick}>
Click me!
</button>
);
}
current
속성을 읽고 수정할 수 있는 일반 JavaScript 객체이다.refs | state |
---|---|
useRef(initialValue) 는 { current: initialValue } 을 반환 | useState(initialValue) 는 state 변수의 현재값과 state 설정자함수([value, setValue] )를 반환 |
변경 시 리렌더링을 촉발하지 않음 | 변경 시 리렌더링을 촉발함 |
Mutable— 렌더링 프로세스 외부에서 current 값을 수정하고 업데이트할 수 있음 | “Immutable”— state setting 함수를 사용하여 state 변수를 수정해 리렌더링을 대기열에 추가해야함 |
렌더링 중에는 current 값을 읽거나 쓰지 않아야 함 | 언제든지 state를 읽을 수 있음. 각 렌더링에는 변경되지 않는 자체 state snapshot이 있음 |
DEEP DIVE
ref는 내부에서 어떻게 작동하는가?
useState
와useRef
는 모두 React에서 제공하지만, 원칙적으로useRef
는useState
위에 구현될 수 있다.
React 내부에서useRef
는 다음과 같이 구현된다고 상상할 수 있다.// Inside of React function useRef(initialValue) { const [ref, unused] = useState({ current: initialValue }); return ref; }
- 첫 번째 렌더링 중에
useRef
는{ current: initialValue }
를 반환한다.
이 객체는 React에 의해 저장되므로 다음 렌더링 중에 동일한 객체가 반환된다.
이 예제에서 state setter가 어떻게 사용되지 않는지 주목하라.
useRef
는 항상 동일한 객체를 반환해야 하기 때문에 불필요하다.- React는 충분히 일반적인 상황이라 판단하고 빌트인 버전의
useRef
를 제공한다.
ref를 설정자가 없는 일반 state 변수라고 생각하면 된다.
객체지향 프로그래밍에 익숙하다면 인스턴스 필드를 떠올릴 수 있는데,this.something
대신somethingRef.current
를 사용하면 된다.
ref.current
를 읽거나 쓰지 말자.ref.current
가 언제 변경되는지 알지 못하기 때문에, 렌더링 중에 읽어도 컴포넌트의 동작을 예측하기 어렵다.if (!ref.current) ref.current = new Thing()
과 같은 코드이다).ref.current = 5;
console.log(ref.current); // 5
ref 자체가 일반 JavaScript 객체
이므로 JavaScript 객체처럼 동작하기 때문이다.<div ref={myRef}>
와 같이 JSX의 ref
어트리뷰트에 ref를 전달하면 React는 해당 DOM 엘리먼트를 myRef.current
에 넣는다.current
라는 단일 프로퍼티를 가진 일반 JavaScript 객체로, 읽거나 설정할 수 있다.useRef
훅을 호출하여 React에 ref를 제공하도록 요청할 수 있다.current
값을 설정해도 리렌더링이 트리거되지 않는다.ref.current
를 읽거나 쓰지 마세요. 이렇게 하면 컴포넌트를 예측하기 어렵다.https://developer.mozilla.org/ko/