

프로젝트를 만들어서 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를 넣어주어야 한다는 것입니다.