반응형
📌 리액트로 구구단 만들기
✔ this.state
: 화면에서 클릭 시 바뀌거나 마우스를 올렸을 때 바뀌는 것들
위와 같이 입력 버튼을 클릭하기 전과 후에 바뀌는 요소들을 this.state 에 넣어주면 된다.
반응형
1. first
2. second
3. value
4. result
constructor(props) {
super(props);
// this.state 에 바뀌는 요소들에 대해 적으면 된다.
// 화면에서 클릭 시 바뀌거나 마우스를 올렸을 때 바뀌는 것들 (boolean 요소들과 같은)
this.state = {
first: Math.ceil(Math.random() * 9), // 첫번 째 숫자 : 임의의 아무 숫자나 만들기
second: Math.ceil(Math.random() * 9), // 두번 째 숫자 : 임의의 아무 숫자나 만들기
value: '', // 입력창에 들어갈 값 (처음에는 아무 값도 없기 때문에 ''로 적어준다.)
result: '', // 결과 값 (처음에는 아무 값도 없기 때문에 ''로 적어준다.)
};
}
// 여기서 {} 안에는 자바스크립트 코드를 넣을 수 있다.
render() {
return (
<div>
<div>{this.state.first} 곱하기 {this.state.second} 는?</div>
<form onSubmit={(e) => {
e.preventDefault();
if (parseInt(value) === this.state.first * this.state.second) {
this.setState({
result: '정답',
first: Math.ceil(Math.random() * 9),
second: Math.ceil(Math.random() * 9),
value: '',
});
} else {
this.setState({
result: '땡',
value: '',
});
}
}}>
<input type="number" value={this.state.value} onChange={(e) => this.setState({ value: e.target.value })} />
<button>입력!</button>
</form>
<div>{this.state.result}</div>
</div>
);
}
근데 jsx 와 javascript 를 섞어서 쓰면 안 된다.
onSubmit = (e) => {
e.preventDefault();
if (parseInt(value) === this.state.first * this.state.second) {
this.setState({
result: '정답',
first: Math.ceil(Math.random() * 9),
second: Math.ceil(Math.random() * 9),
value: '',
});
} else {
this.setState({
result: '땡',
value: '',
});
}
}
onSubmit 을 이렇게 함수로 빼주고
<form onSubmit={this.onSubmit}>
return 안에는 이렇게 간단하게 넣어준다. 그러면 코드가 훨씬 간결해진다.
<input type="number" value={this.state.value}
onChange={(e) => this.setState({value: e.target.value})}/>
input 태그에 들어있는 onChange 도 함수로 빼준다.
✔ 코드 정리
<div id="root"></div>
<script type="text/babel">
class GuGuDan extends React.Component {
constructor(props) {
super(props);
// this.state 에 바뀌는 요소들에 대해 적으면 된다.
// 화면에서 클릭 시 바뀌거나 마우스를 올렸을 때 바뀌는 것들 (boolean 요소들과 같은)
this.state = {
first: Math.ceil(Math.random() * 9), // 첫번 째 숫자 : 임의의 아무 숫자나 만들기
second: Math.ceil(Math.random() * 9), // 두번 째 숫자 : 임의의 아무 숫자나 만들기
value: '', // 입력창에 들어갈 값 (처음에는 아무 값도 없기 때문에 ''로 적어준다.)
result: '', // 결과 값 (처음에는 아무 값도 없기 때문에 ''로 적어준다.)
};
}
onSubmit = (e) => {
e.preventDefault();
if (parseInt(this.state.value) === this.state.first * this.state.second) {
// 입력한 값과, 실제 결과가 같다면 값들이 어떻게 바뀔지
this.setState({
result: '정답',
first: Math.ceil(Math.random() * 9),
second: Math.ceil(Math.random() * 9),
value: '',
});
} else {
this.setState({
result: '땡!!!!!!!!!!!!!!!!!!!',
value: '',
});
}
}
onChange = (e) => {
this.setState({ value: e.target.value })
}
// 여기서 {} 안에는 자바스크립트 코드를 넣을 수 있다.
render() {
return (
<div>
<div>{this.state.first} 곱하기 {this.state.second} 는?</div>
<form onSubmit={this.onSubmit}>
<input type="number" value={this.state.value}
onChange={this.onChange}/>
<button>입력!</button>
</form>
<div>{this.state.result}</div>
</div>
);
}
}
</script>
<script type="text/babel">
ReactDOM.render(<GuGuDan/>, document.querySelector('#root'));
</script>
✔ 결과
- 첫 화면
- 답을 맞췄을 때
정답이라는 문구가 뜨고 다음 문제로 넘어간다.
- 답을 틀렸을 때
틀렸다고 소리지르고 다시 문제 풀 기회를 준다.
➕ input 태그에 focus 주기
: ref 사용하기
<input ref={(c) => {this.input = c;}} type="number" value={this.state.value}
onChange={this.onChange}/>
input 태그 안에 ref={(c) => {this.input = c;}} 를 넣어준다.
// input focus를 위한 코드
input;
// 여기서 {} 안에는 자바스크립트 코드를 넣을 수 있다.
render() {
return (
<div>
<div>{this.state.first} 곱하기 {this.state.second} 는?</div>
<form onSubmit={this.onSubmit}>
<input ref={(c) => {this.input = c;}} type="number" value={this.state.value}
onChange={this.onChange}/>
<button>입력!</button>
</form>
<div>{this.state.answer} {this.state.result}</div>
</div>
);
}
}
return 바깥에 input; 적어주고
onSubmit = (e) => {
e.preventDefault();
if (parseInt(this.state.value) === this.state.first * this.state.second) {
// 입력한 값과, 실제 결과가 같다면 값들이 어떻게 바뀔지
this.setState({
result: '정답',
first: Math.ceil(Math.random() * 9),
second: Math.ceil(Math.random() * 9),
value: '',
answer: this.state.first * this.state.second,
});
this.input.focus();
} else {
this.setState({
result: '땡!!!!!!!!!!!!!!!!!!!',
value: '',
answer:'',
});
this.input.focus();
}
}
화면의 state 가 바뀔 때 마다 input 에 focus가 되도록
this.input.focus(); 를 적어준다.
근데 render 는 너무 자주 실행되기 때문에 ref 내용을 바깥으로 빼주는 것이 좋다.
onRefInput = (c) => { this.input = c; };
<input ref={this.onRefInput} />
참고 : 인프런 - 웹 게임을 만들며 배우는 React (조현영)
반응형
'Front > React' 카테고리의 다른 글
[React] onClick을 활용하여 버튼을 누르면 값이 변경되는 코드 작성하기 (4) | 2024.02.20 |
---|---|
[React] 미니 블로그 만들기 (0) | 2023.04.26 |
[React] styled-components (0) | 2023.04.25 |
[React] Font 와 관련된 속성 (0) | 2023.04.25 |
[React] Context 를 사용하여 테마 변경 기능 만들기 (0) | 2023.04.25 |