Post

ref




ref



1. ref?

리엑트 프로젝트 내에서 DOM 요소에 직접 이름을 지정할 수 있습니다.
HTML id와 유사하지만 재사용되는 컴포넌트 안에서 유일해야하는 id를
중복해서 가진 DOM이 생겨 문제가 될 수 있습니다.

2. ref 사용 상황

DOM을 꼭 직접적으로 조작해야 할 때 사용됩니다.

  • 특정 input에 포커스 주기
  • 스크롤 박스 조작하기
  • Canvas 요소에 그림 그리기

3. ref 사용 방법

콜백 함수, createRef 두 가지 방법이 있습니다.

3.1. 콜백 함수를 통한 ref 설정

ref를 달고자 하는 요소에 ref라는 콜백 함수를 props로 전달합니다.

1
<input ref={(ref) => this.input=ref}/>
  • this.input은 input 요소의 DOM을 가리킨다.
  • this.input의 input name은 자유롭게 지정 가능하다.(this.user)

3.2 createRef

리엑트에 내장되어 있는 함수로 리엑트 v16.3 부터 도입 됐습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import {Component} from 'react'

class RefSample extends Component {

    input = React.createRef();

    handleFocus = () => {
        this.input.current.focus();
    }

    render() {
        return (
            <div>
                <input ref={this.input}/>
            </div>
        );
    }
}

export default RefSample;
  • 컴포넌트 내부에서 멤버 변수로 ‘React.createRef()’를 담아 준다.
  • 해당 멤버 변수를 ref를 달고자하는 요소에 ‘ref props’로 넣어 준다.
  • DOM요소에 접근하려면 ‘this.input.current’를 조회 한다.

4. 컴포넌트에 ref 지정하기

컴포넌트 내부의 DOM을 컴포넌트 외부에서 사용할 때 사용하는 방법입니다.

4.1. 사용법

1
<input ref={(ref) => {this.myComponent=ref}}/>

4.2. 컴포넌트에 적용해보기

  • ScrollBox 컴포넌트 최상위 DOM에 ref 지정하기
  • ScrollBox 컴포넌트에 메서드 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import {Component} from 'react'

class ScrollBox extends Component {

    render() {
        const style = {};
        const innerStyle = {};
    }

    scrollToBottom = () => {
        const {scrollHight, clienHeight} = this.box;

        this.box.scrollTop = scrollHeight - cleanHeight
    }

    return (
        <div
            style={style}
            ref={(ref) => {this.box=ref}}>
            <div style={}innerStyle/>
        </div>
    );
}

export default ScrollBox;
  • App.js에 불러온 컴포넌트에 ref 지정 후 메서드 사용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { Component } from 'react'
import ScrollBox from './ScrollBox'

class App extends Component {

    render() {
       return (
        <div>
            <ScrollBox ref = {(ref) => this.scrollBox=ref}>
            <button onClick = {() => this.scrollBox.scrollToBottom()}>
             밑으로
            </button>
        </div>
       );
    }
}

export default App;
  • div => scrollToBottom() => ScrollBox => button onClick

5. 주의할 점

리엑트는 부모에서 자식으로 흐름을 만들게끔 설계되어있기 때문에
규모가 커졌을 때 ref를 남용할 경우 스파게티 코드가되어 유지 보수가 불가능해 집니다.
ref를 사용하지 않고도 원하는 기능을 구현할 수 있는지 반드시 고려하세요.

This post is licensed under CC BY 4.0 by the author.