과거 프로그래밍 자료들/React
[웹 게임을 만들며 배우는 React] - 구구단
평부
2022. 9. 2. 09:47
1. 클래스형 컴포넌트 : state 사용 위함
class GuGudan extends React.component {}
2. state
- 변화하는 데이터를 처리할 때 state(상태)를 사용
- state는 변화하는 데이터를 저장하는 것
class GuGuDan extends React.Component {
constructor(props) {
super(props)
this.state = {
num1: Math.ceil(Math.random() * 9),
num2: Math.ceil(Math.random() * 9),
value: '',
result: '',
win: 0,
}
}
3. render
- render 함수 안에서 javascript 코드와 XML을 작성해 화면을 만들겠다 설정
render() {
return (
<>
<h1>{this.state.num1} 곱하기 {this.state.num2} 은?</h1>
<form onSubmit={this.onSubmit}>
<input type="number" value={this.state.value} onChange={this.onChange} />
<button>submit</button>
</form>
<h3>{this.state.result}</h3>
<h4>{this.state.win} 연속 정답!</h4>
</>
)
}
4. ReactDom.render
- render 함수에서 무엇을 만들 것인지 언급했다면 ReactDom.render에서 render에서 사용할 코드 작성
- 웹에다가 실제로 렌더링 해주는 역할
// ReactDOM.render(<클래스명 />, 컴포넌트가 들어갈 곳);
<script type="text/babel">
ReactDOM.render(<GuGuDan />, document.querySelector("#root"));
</script>
5. 렌더링
- <form onSubmit={this.onSubmit}>에서 바로 함수를 만들지 않고 클래스에 따로 정의한 다음 사용
- setState : 상태를 설정할 때 사용, 사용 시 render 함수가 다시 실행됨
- 만약 render 함수에 함수를 그대로 넣으면 render 함수가 실행될 때마다 함수가 계속 생성됨
(따라서 클래스 안에 함수를 정희하고 사용함)
6. React.Fragment
- 리액트가 처음 생겼을 때 무조건 <div></div>태그를 썼어야 하지만 시간이 지날수록 불편해짐
- <React.Frament></React.Fragment> 사용 시 필요 없는 <div></div> 태그를 피할 수 있음
render() {
return (
<React.Fragment>
<h1>{this.state.num1} 곱하기 {this.state.num2} 은?</h1>
<form onSubmit={this.onSubmit}>
<input type="number" value={this.state.value} onChange={this.onChange} />
<button>submit</button>
</form>
<h3>{this.state.result}</h3>
<h4>{this.state.win} 연속 정답!</h4>
</React.Fragment>
)
}
* 전체 코드
더보기
<html>
<head>
<meta charset="utf-8" />
<title>구구단</title>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<!-- react가 동작하는 핵심적인 코드가 존재 -->
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js">
</script>
<!-- react코드를 웹에다가 붙여주는 역할 -->
</head>
<body>
<div id="root"></div>
<script type="text/babel">
const e = React.createElement; // HTML 태그를 만들어주는 함수
class GuGuDan extends React.Component {
constructor(props) {
super(props)
this.state = {
num1: Math.ceil(Math.random() * 9),
num2: Math.ceil(Math.random() * 9),
value: '',
result: '',
win: 0,
result2: ''
}
}
onSubmit = (e) => {
e.preventDefault();
const answer = this.state.num1 * this.state.num2;
const cur_win = this.state.win;
if (parseInt(this.state.value) === answer) {
//parseInt : 자료를 int형으로 변환
//예전 state값으로 새로운 state를 만들 때는 새로운 함수를 씀
this.setState((prevState) => {
return {
num1: Math.ceil(Math.random() * 9),
num2: Math.ceil(Math.random() * 9),
value: '',
// result: `${prevState.value} 정답!`,
result: `정답! ${this.state.num1} * ${this.state.num2} = ${this.state.value}`,
win: cur_win + 1,
}
})
}
else {
this.setState({
value: '',
result: `오답...`,
win: 0
})
}
}
onChange = (e) => {
console.log(e);
this.setState({ value: e.target.value });
};
render() {
return (
<React.Fragment>
<h1>{this.state.num1} 곱하기 {this.state.num2} 은?</h1>
<form onSubmit={this.onSubmit}>
<input type="number" value={this.state.value} onChange={this.onChange} />
<button>submit</button>
</form>
<h3>{this.state.result}</h3>
<h4>{this.state.win} 연속 정답!</h4>
</React.Fragment>
)
}
}
function Test() {
return <h1>test</h1>
}
</script>
<script type="text/babel">
// 웹에다가 실제로 렌더링 해주는 역할, LikeButton을 root 태그에 붙임
ReactDOM.render(<GuGuDan />, document.querySelector("#root"));
</script>
</body>
</html>