Reference

  • The ref is used to return a reference to the element.
  • Refs should be avoided in most cases, however, they can be useful when we need DOM measurements or to add methods to the components.

Use Case

  • String Attribute / Callback Function

String Attribute

class Hello extends React.Component {
    render() {
        return (
            <div> 
                <input ref="myInput">
                </input>
            </div>
        )
    }
  
    componentDidMount() {
        this.refs.myInput.value = "Hi, I used ref to do this";
    }
}

ReactDOM.render(
    <Hello/>,
    document.getElementById('app')
);
  • DOM에 ref=”refName” 형식으로 ref를 지정한다.
  • 문자열 형식으로 만든 ref 는 this.refs.refName으로 접근해야 한다.
  • refs 를 사용 할 때는 컴포넌트가 렌더링 된 후 이여야 한다.

Callback Function

class Hello extends React.Component {
    render() {
        return (
            <div> 
                <input ref={ref => this.input = ref}>
                </input>
            </div>
        )
    }
    
    componentDidMount() {
        this.input.value = "I used ref to do this";
    }
}

ReactDOM.render(
    <Hello/>,
    document.getElementById('app')
);
  • { } 안에 함수를 넣어 ref 를 arrow function 을 사용하여 설정 함.
  • 함수 안에서 어떤 변수가 ref 로 사용 될 지 직접 정의 함.
  • 5번줄에서 썼던 변수를 ref 로 사용하면, String을 쓸 때 처럼 this.refs 를 사용하지 않아도 된다.

Component example

class Hello extends React.Component {
    handleClick() {
	    this.textBox.input.value = "I used ref";
    } 

    render() {
        return (
            <div> 
                <TextBox ref={ref=>this.textBox = ref}/>
                <button onClick={this.handleClick.bind(this)}>Click Me</button>
            </div>
        )
    }
}

class TextBox extends React.Component {
    render() {
        return(
            <input ref={ref => this.input = ref}>
        </input>
        )
    }
}

ReactDOM.render(
    <Hello/>,
    document.getElementById('app')
)
  • TextBox 컴포넌트의 input 박스의 ref를 this.input으로 지정하였으며
  • Hello 컴포넌트에서 TextBox 컴포넌트의 ref 를 this.textBox 로 지정하고
  • ref 를 통하여 input 의 값을 변경한다.

Example

  • input 과 button 이 있고 button 을 누르면 input 을 초기화 하고 Focus 를 input 으로 이동
class Hello extends React.Component {
    handleClick() {
        this.input.value = "";
        this.input.focus();
    } 
    
    render() {
        return (
            <div> 
                <input ref={ref=> this.input = ref}/>
                <button onClick={this.handleClick.bind(this)}>Click Me</button>
            </div>
        );        
    }
}

ReactDOM.render(
  <Hello/>,
  document.getElementById('app')
);
  • JavaScript DOM 메소드를 이용하여 인풋박스에 포커스를 한다.
  • state 및 prop 로 해결 할 수 있는 부분에서는 ref 를 사용하지 않고, component 에 의해 렌더링 된 DOM 에 직접 어떠한 처리를 하는 경우 사용하자.