기타/기타 잡다한 것들

8. reference: DOM

제주도소년 2019. 5. 7. 11:20

1. ref 는 어떤 상황에서 사용해야 하나 - "DOM을 꼭 간접적으로 건드려야 할 때 사용한다."

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

이 때는 어쩔수 없이 DOM에 직접적으로 접근해야 하는데, 이 때 ref 를 사용한다.

 

2. ref 사용법

- ref 를 달아야하는 DOM에 ref 속성을 추가할 때는 props를 설정하듯이 하면 된다. ref 값으로 콜백함수를 전달하고, 콜백 함수는 ref를 파라미터로 가지며 , 콜백 함수 내부에서 컴포넌트의 멤버 변수에 ref를 담는 코드를 작성한다.

 

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

 

이렇게 하면 앞으로 this.input 은 input 요소의 DOM을 가리키게 된다. ref 이름은 자유롭게 지정한다.

(ex this.jongwan=ref)

 

handleButtonClick = () => {

this.setState({

clicked: true,

validated: this.state.password === '0000'

})

this.input.focus(); //버튼 클릭시 input 에 포커스를 준다

}

 

3. 컴포넌트에 ref 달기

- 리액트에서는 컴포넌트에도 ref를 달 수 있다. 이 방법은 주로 컴포넌트 내부에 있는 DOM을 컴포넌트 외부에서 사용할 때 쓴다.

 

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

 

이렇게 하면 MyComponent 내부의 메서드 및 멤버 변수에도 접근할 수 있다. 즉 내부의 ref(myComponent.handleClick .. 등)

 

예제 부모컴포넌트에서 스크롤바 내리기

순서 : ScrollBox 컴포넌트 생성 -> 컴포넌트에 ref 달기 -> ref를 이용하여 컴포넌트 내부 메서드 호출하기

 

ScrollBox.js

import React, { Component } from 'react';

 

class ScrollBox extends Component {

scrollToBottom = () => {

//비 구조화 할당 문법

const { scrollHeight, clientHeight} = this.box;

 

this.box.scrollTop = scrollHeight - clientHeight;

}

render() {

const style = {

border: '1px solid black' ,

height: '300px',

width: '300px',

overflow: 'auto',

position: 'relative'

};

 

const innerStyle = {

width: '100%',

height: '650px',

background: 'linear-gradient(white, black)'

}

return (

<div style={style} ref={(ref) => {this.box=ref}}>

<div style={innerStyle}></div>

</div>

);

}

}



export default ScrollBox;

App.js

import React, { 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;

 

결과

'기타 > 기타 잡다한 것들' 카테고리의 다른 글

10. 컴포넌트 스타일링 - scss  (0) 2019.05.14
9. 컴포넌트 반복  (0) 2019.05.10
7. 이벤트 핸들링  (0) 2019.04.11
6. 컴포넌트  (0) 2019.04.08
5. JSX  (0) 2019.04.08