IT/React
리액트(React) 스터디일지6 : ref (reference)
라임웨일
2021. 4. 8. 15:22
반응형
리액트에서는 ID 사용을 권장하지 않습니다. 컴포넌트 단위로 사용을 하는 주된 목적은 재사용성을 높이기 위한 게 가장 큰 목적인데 ID를 사용하게 되면 DOM에서 중복 ID값이 생길 수가 있게 되기 때문입니다.
그래서 리액트에서는 요소에 접근하기 위해 ref를 사용합니다. ref는 컴포넌트 내부에서만 동작하기 때문에 중복의 문제가 발생되지 않습니다.
예제코드 1
class ValidationSample extends Component {
state = {
password: '',
clicked: false,
validated: false,
};
handleChange = (e) => {
this.setState({
password: e.target.value,
});
};
handleButtonClick = (e) => {
this.setState({
clicked: true,
validated: this.state.password === '0000',
});
this._target.focus();
};
render() {
return (
<div>
<input
type="password"
value={this.state.password}
onChange={this.handleChange}
className={
this.state.clicked
? this.state.validated
? 'success'
: 'failure'
: ''
}
ref={(ref) => (this._target = ref)}
/>
<button onClick={this.handleButtonClick}>검증하기</button>
</div>
);
}
}
export default ValidationSample;
예제 코드 2
import React, { Component } from 'react';
import ScrollBox from './ScrollBox';
export default class App extends Component {
render() {
return (
<div>
<ScrollBox ref={(ref) => (this.ScrollBox = ref)} />
<button onClick={() => this.ScrollBox.scrollToBottom()}>
맨 밑으로
</button>
</div>
);
}
}
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>
);
}
}
export default ScrollBox;
반응형