반응형
1. Ref란?
ref는 DOM을 직접적으로 건드려야하는 때 사용합니다. 순수 js로 컴포넌트를 제어하는 방식으로, ref는 current 프로퍼티를 가진 객체입니다.
2. id가 아니라 ref를 사용하는 이유는?
id는 DOM에서 유일해야하는데, React 컴포넌트는 여러번 사용될 수 있기 때문에 id를 사용하는것이 적절하지 않습니다.
반면에, ref는 전역적으로 작동하지 않고 컴포넌트 내부에서만 작동하기 때문입니다.
3. ref를 사용하는 방법
3-1. 클래스형 컴포넌트에서 사용하는 방법
- React.createRef 메소드를 사용합니다.
- 변수명.current로 접근할 수 있습니다.
- React 16.3 버전부터 사용 가능합니다.
class RefSample extends Component {
input = React.createRef();
handleFocus = () => {
this.input.current.focus();
}
render() {
return (
<div>
<input ref={this.input} />
<button onClick={() => this.handleFocus}>
포커스
</button>
</div>
);
}
}
3-2. 함수형 컴포넌트에서 ref를 사용하는 방법
- useRef 훅을 사용해야합니다. createRef를 사용할 수는 있지만, 함수 호출에 따라 createRef로 재호출되는 문제가 있습니다. 그렇기에 useRef를 권장합니다.
- 마찬가지로, 변수명.current로 접근할 수 있습니다.
예시코드
import { useRef } from "react";
function RefSample() {
const input = useRef();
const handleFocus = () => {
input.current.focus();
}
return (
<div>
<input ref={input} />
<button onClick={handleFocus}>
포커스
</button>
</div>
);
}
3-3. 콜백함수를 통해 사용하는 방법
- jsx 내 DOM 요소에 ref 프로퍼티 내 콜백 함수를 통해 ref를 전달합니다.
예시코드
<input
ref={(ref) => this.input = ref}
>
4. 실제 어플리케이션에서 사용하는 예시 (from. legacy 공식 문서)
- 포커스, 텍스트 선택영역, 혹은 미디어의 재생을 관리할 때.
- 애니메이션을 직접적으로 실행시킬 때.
- 서드 파티 DOM 라이브러리를 React와 같이 사용할 때.
5. ref와 state의 차이 비교
ref | state |
---|---|
useRef(initialValue) => { current : initialValue} 반환 |
useState(initialValue) => [state = initialValue, setState] 반환 |
변화 시 리렌더링이 일어나지 않는다 | 변화할 때마다 리렌더링이 일어난다 |
Mutable - 렌더링 프로세스 외부에서 current 값을 수정하고 업데이트할 수 있음 | Immutable - setState를 통해서 수정해 리렌더링을 대기열에 추가해야함 |
You shouldn’t read (or write) the current value during rendering. 렌더링 중에는 current 값을 읽거나 쓰지 말아야한다. | You can read state at any time. However, each render has its own snapshot of state which does not change. state를 언제든 읽어올 수 있다. 그러나, 각 렌더링은 변화되지 않은 state을 스냅샷으로 갖고 있다. |
비제어컴포넌트 | 제어 컴포넌트 |
6. forwardRef
함수형 컴포넌트에서 부모 컴포넌트가 자식 컴포넌트의 DOM 요소에 접근하고자 할 때 사용하는 메서드이다.
- forwardRef를 통해 ref를 prop으로 받아서 원하는 element에 전달할 수 있다.
- forwardRef로 자식 컴포넌트를 감싸고 전달하고자 하는 ref를 props 다음 두번째 인자로 전달한다.
예시코드
function App() {
const ref = useRef(null);
useEffect(() => {
console.log(ref);
}, [ref]);
return (
<div className="App">
<StyledInput ref={ref} />
</div>
);
}
const StyledInput = forwardRef((props, ref) => {
return <input ref={ref} />;
});
참고자료 출처
ref로 값 참조하기 – React
The library for web and native user interfaces
react-ko.dev
React ref 톺아보기
0. Intro React로 웹프론트엔드 개발을 하다보면 React만으로는 DOM을 조작하기 어려울 때가 있습니다. 가장 흔하게는 어떤 엘리먼트를 focus 해야 할 때 말이죠. React의 ref는 무엇이고, ref…
tecoble.techcourse.co.kr
반응형
'Frontend' 카테고리의 다른 글
리액트 생명주기와 useEffect (0) | 2024.03.02 |
---|---|
[React] Virtual DOM과 동작원리 (0) | 2024.02.23 |
[@tanstack/react-query] Query Status와 Fetch Status (0) | 2024.01.29 |
[Javascript] 이터러블과 이터레이터 프로토콜 (2) | 2024.01.25 |
[Monorepo] yarn workspace 모노레포 내의 컴포넌트가 import 되지 않을 때 해결법 (@babel/runtime, yarn berry와 npm의 차이) (2) | 2024.01.19 |