JSX 안에서 DOM에 id를 달면 해당 DOM을 렌더링할 때 그대로 전달된다. 하지만 DOM은 유일해야하는데 컴포넌트를 여러번 사용하는 경우 id의 중복이 발생할 수 있어 잘 사용하지 않는다.
ref는 전역적으로 작동하지 않으며 컴포넌트 내부에서만 작동하기 때문에 이러한 문제를 일으키지 않는다. id를 사용해야하는 경우 추가 텍스트를 붙어 중복 id가 발생하는 것을 방지하는 것이 좋다
ref 사용 상황 : DOM을 반드시 직접적으로 건드려야 하는 경우
DOM을 반드시 사용해야하는 상황
- 틍적 input에 포커스 주기
- 스크롤박스 조작하기
- Canvas 요소에 그림 그리기 등
ref 사용
콜백함수를 통한 ref 설정 : ref를 만드는 가장 기본적인 방법이다. ref를 달고자하는 요소에 ref라는 콜백함수를 props로 전다랳주면된다. 이 콜백함수는 ref 값을 파라미터로 전달받는다. 그리고 함수 내부에서 파라미터로 받은 ref를 컴포넌트의 멤버 변수로 설정
<input ref = {(ref) => {this.input = ref}} />
위와 같이 설정하면 this.input은 input 요소의 DOM을 가리키게 된다.
createRef를 통한 ref 설정 : 리액트에 있는 createRef라는 함수를 이용, 이이 함수를 이용하면 더 적은 코드로 사용할 수 있으며 v16.3이후 도입된 기능이다.
import React, { Component } from 'react';
class RefSample extends Component {
input = React.createRef();
hanldeFocus = () => {
this.input.current.focus();
}
render() {
return (
<div>
<input ref = {this.input} />
</div>
);
}
}
export default RefSample;
createRef를 사용하여 ref를 만들기 위해서는 우선 컴포넌트 내부에서 멤버 변수소 React.createrRef()를 담아 주어야 한다. 그리고 해당 변수를 ref를 달고자 하는 요소에 ref props로 넣어 주면 ref설정이 완료 된다. ref 설정이후 DOM에 접근 하려면 this.input.current를 조회하면 된다.
컴포넌트 ref : 주로 컴포넌트 내부에 있는 DOM을 컴포넌트 외부에서 사용할 때 쓴다. 컴포넌트에 ref를 다는 방법은 같다.
<MyComponent
ref = {(ref) => {this.myComponent=ref}}
/>
<div>
<ScrollBox ref={ref => (this.scrollBox = ref)} />
<button onClick={() => this.scrollBox.scrollToBottom()}>
맨 밑으로
</button>
</div>
문법 상으로는 onClick = {this.scrollBox.scrollBottom} 같은 형식ㄷ으로 작성해도되나 컴포넌트가 처음 렌더링 될 때는 this.scrollBox값이 undefined이기에 this.scroollBox.scrollToBottom값을 읽어오는 과정에서 오류가 발생한다. 화살표 함수 문법을 이용하여 새로운 함수를 만들고 내부에서 this.scrollBox.scrollToBottom 메서드 실행시 값을 읽어와 실행하기에 오류 발생 하지 않는다.
댓글