프로젝트를 만들어서 ValidationSample.js / ValidationSample.css 파일을 작성해 봅시다.
ValidationSample.js파일
// ValidationSample.js
import React, { Component } from 'react';
import './ValidationSample.css';
class ValidationSample extends Component {
state = {
password: '',
clicked: false,
validated: false // 비밀번호가 틀림
}
handleChange = e => {
this.setState({
password: e.target.value
});
}
handleButtonClick = () => {
this.setState({
clicked: true,
validated: this.state.password === '0000'
})
}
render() {
return (
<div>
<input
type="password"
value={this.state.password}
onChange={this.handleChange}
className={this.state.clicked ? (this.state.validated ? 'success' : 'failure') : ''}
/>
<button onClick={this.handleButtonClick}>검증하기</button>
</div>
);
}
}
export default ValidationSample;
ValidationSample.css파일
/* ValidationSample.css */
.success {
background-color: lightgreen; /* 초록색으로 변경 */
}
.failure {
background-color: lightcoral; /* 빨간색으로 변경 */
}
state
handleChange 함수
password
상태를 업데이트합니다.handleButtonClick 함수
clicked
상태를 true
로 설정하고,validated
상태를 비밀번호가 '0000'과 일치하는지 여부에 따라 설정합니다.render 함수
결과적으로 이 코드에서 의도하는 바는
- “검증하기” 버튼을 눌렀을때 handleButtonClick함수를 호출합니다.
버튼을 누르지 않는다면 handleButtonClick함수가 호출되지 않아서
className={this.state.clicked ? (this.state.validated ? 'success' : 'failure') : ''}
⇒ 누르지 않는다면 clicked값이 false
로 고정이기 때문에 변경이 없습니다.
- handleButtonClick함수를 호출하여 clicked값을 true로 설정합니다.
- clicked값이 true로 변경됬을 때 this.state.validated를 호출하여 값이 ‘0000’인지 체크합니다.
this.state.validated ? 'success' : 'failure’
⇒ 이 코드에 따라서 ClassName에 비밀번호가 ’0000’이라면 ‘success’, 아니라면 ‘failure’가 리턴됩니다.
- 바뀐 ClassName에 의하여 설정해둔 css에 따라 스타일이 변경됩니다.
// ValidationSample1.js
import React, { Component } from 'react';
import './ValidationSample.css';
class ValidationSample1 extends Component {
state = {
password: '',
clicked: false,
validated: false // 비밀번호가 틀림
}
handleChange = e => {
this.setState({
password: e.target.value
});
}
handleButtonClick = () => {
this.setState({
clicked: true,
validated: this.state.password === '0000'
})
this.input.style.fontSize = "40px";
this.input.focus();
}
render() {
return (
<div>
<h2>콜백함수로 ref 만들기!</h2>
<input
ref={(ref) => {this.input=ref}}
value={this.state.password}
onChange={this.handleChange}
className={this.state.clicked ? (this.state.validated ? 'success' : 'failure') : ''}
/>
<button onClick={this.handleButtonClick}>검증하기1</button>
</div>
);
}
}
export default ValidationSample1;
이렇게 하면 앞으로 this.input
은 input요소의 DOM을 가리킵니다.
ref의 이름은 원하는 것으로 자유롭게 지정할 수 있습니다.
DOM 타입과 관계없이 this.superman = ref
처럼 마음대로 지정할 수 있습니다.
// ValidationSample2.js
import React, { Component } from "react";
import "./ValidationSample.css";
class ValidationSample2 extends Component {
input = React.createRef();
state = {
password: "",
clicked: false,
validated: false, // 비밀번호가 틀림
};
handleChange = (e) => {
this.setState({
password: e.target.value,
});
};
handleButtonClick = () => {
this.setState({
clicked: true,
validated: this.state.password === "0000",
});
this.input.current.style.fontSize = "60px";
this.input.current.focus();
};
render() {
return (
<div>
<h2>createRef를 통해 ref만들기!</h2>
<input
ref={this.input}
value={this.state.password}
onChange={this.handleChange}
className={this.state.clicked ? this.state.validated ? "success" : "failure" : ""}
/>
<button onClick={this.handleButtonClick}>검증하기2</button>
</div>
);
}
}
export default ValidationSample2;
createRef를 사용하여 ref를 만들려면
우선 컴포넌트 내부에서 멤버 변수로 **React.createRef()**
를 담아 주어야 합니다.
그리고 해당 변수를 ref를 달고자 하는 요소에 ref props로 넣어 주면 설정이 완료 됩니다.
ref를 설정해준 DOM에 접근하려면 this.input.current를 조회하면 됩니다.
콜백함수를 사용할 때와 다른 점은 뒷부분에 .current
를 넣어주어야 한다는 것입니다.