class Validation extends Component {
state = {
password: '',
clicked: false,
validated: false,
};
//input의 변화를 감지하여 값을 얻게하는 handleChange 함수
handleChange = (e: any) => {
this.setState({
password: e.target.value,
});
};
handleButtonClick = () => {
this.setState({
clicked: true,
validated: this.state.password === '0000',
});
};
render() {
return (
<div>
<div>
<input
type="password"
value={this.state.password}
onChange={this.handleChange}
//state의 clicked와 validated의 변화하는 boolean 값을 통해 다른 색상을 갖게 하였다.
style={
{backgroundColor: this.state.clicked
? this.state.validated
? 'lightgreen'
: 'orangered'
: ''}
}
/>
<button onClick={this.handleButtonClick}>검증하기</button>
</div>
);
}
}
여러개의 동일한 DOM 중 하나의 DOM 상태를 변경해야 하거나, DOM의 위치에 따라 상태의 변화가 일어나야 할 때 ref를 사용한다.
<input ref={(ref) => {this.regacyInput=ref}}/>
input:React.RefObject<HTMLInputElement> = React.createRef();
요소에 ref를 props로 전달한 뒤, 조작하기 위해서는 this.input.current를 통해 조작할 수 있는데, 버튼을 클릭하면 focus가 되는 방법을 예시로 만들어보자면
...
// 버튼을 클릭하면 input에 focusing 되는 함수. 옵셔널 체이닝은 ts.
handleFocus = () =>{
this.input.current?.focus();
}
<input ref={this.input}/>
<button onClick={this.handleFocus}>인풋포커스</button>
콜백 함수와 다른점은 뒷 부분에 this.input 다음에 current를 넣어주어야 한다는 것이다.
import React, { Component } from 'react';
class Validation extends Component {
state = {
password: '',
clicked: false,
validated: false,
};
regacyInput:any;
input:React.RefObject<HTMLInputElement> = React.createRef();
handleFocus = () =>{
}
handleChange = (e: any) => {
this.setState({
password: e.target.value,
});
};
handleButtonClick = () => {
this.setState({
clicked: true,
validated: this.state.password === '0000',
});
this.input.current?.focus();
};
render() {
return (
<>
<div>
<input
ref={this.input}
type="password"
value={this.state.password}
onChange={this.handleChange}
style={
{backgroundColor: this.state.clicked
? this.state.validated
? 'lightgreen'
: 'orangered'
: ''}
}
/>
<button onClick={this.handleButtonClick}>검증하기</button>
</div>
</>
);
}
}
export default Validation;