HTML에서 id를 사용하여 DOM에 이름을 다는 것처럼 리액트 프로젝트 내부에서 DOM에 이름을 다는 방법이 있다. 바로 ref(reference의 줄임말) 개념이다.
리액트 컴포넌트 안에서도 id를 사용할 수는 있다. 하지만 컴포넌트의 특성상 여러번 사용되게 되면 HTML에서 id가 중복되어 나타나기 때문에 잘못된 사용이 된다.
반면 ref는 전역적으로 작동하지 않고 컴포넌트 내부에서만 작동하기 때문에 이런 문제가 생기지 않는다.
ref는 'DOM을 꼭 직접적으로 건드려야 할 때' 사용해야한다.
클래스 컴포넌트에서는 2가지 방법으로 ref를 사용할 수 있다.
createRef
를 통한 ref 설정ref를 만드는 가장 기본적인 방법은 콜백함수를 사용하는 것이다.
ex ) 콜백 함수 사용 예시
<input ref={(ref) => {this.input=ref}} />
this.input.focus();
ref의 이름은 원하는 것으로 자유롭게 지정할 수 있다.
createRef
는 리액트 v16.3부터 도입되었다.
ex ) createRef
사용 예시
React.createRef()
를 담아 준다.class RefSample extends Component {
input = React.createRef();
...
}
...
render() {
return (
<div>
<input ref={this.input} />
</div>
);
}
}
.current
를 넣어준다.this.input.current.focus();
리액트에서는 컴포넌트에도 ref를 달 수 있다. 주로 컴포넌트 내부에 있는 DOM을 컴포넌트 외부에서 사용할 때 쓴다.
<MyComponent
ref={(ref) => {this.myComponent=ref}}
/>
MyComponent 내부의 메서드 및 멤버 변수에도 접할 수 있다 (예: myComponent.handleClick, myComponent.input 등).
<MyComponent ref={(ref) => {this.myComponent=ref}} />
<button onClick={() => this.myComponent.handleClick()} />