2021.04.14
바뀌는 것은 state
로 등록을 해준다.
직접 수동으로 바꿀 값들만 state
로 만들어 준다.
안 바뀌는 것은 tag
로 만들어 둔다.
// 구구단 컴포넌트 만들기
class GuGuDan extends React.Component {
constructor(props) {
super(props);
this.state = {
first: Math.ceil(Math.random() * 9), //첫 번째 랜덤 숫자
second: Math.ceil(Math.random() * 9), // 두 번째 랜덤 숫자
value: '', //input 값
result: '', //결과 값
};
}
onSubmit = (e) => {
e.preventDefault();
if(parseInt(this.state.value) === this.state.first * this.state.second) {
this.setState({
result: `${this.state.value} : 정답입니다.`
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> //{}안에는 js를 사용할 수 있다.
<form onSubmit={this.onSubmit}>
<input type="number" value={this.state.value} onChange={this.onChange} />
<button type="submit">입력</button>
</form>
<div>{this.state.result}</div>
</div>
);
}
}
ReactDOM.render(<GuGuDan />, document.querySelector('#root'));
태그 사이 컨텐츠 영역에 {}를 사용해서 js문법을 사용할 수 있다.
중괄호 사이에 js문법 작성
이벤트리스너는 함수(메서드)로 빼서 따로 작성한다.
//ex)
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}
class Columns extends React.Component {
render() {
return (
<div>
<td>Hello</td>
<td>World</td>
</div>
);
}
}
//<Table /> html 출력 결과
<table>
<tr>
<div>
<td>Hello</td>
<td>World</td>
</div>
</tr>
</table>
// 쓸 데 없는 div가 생기는 문제를 fragment가 해결해 준다.
class Columns extends React.Component {
render() {
return (
<React.Fragment>
<td>Hello</td>
<td>World</td>
</React.Fragment>
);
}
}
//단축 문법
class Columns extends React.Component {
render() {
return (
<>
<td>Hello</td>
<td>World</td>
</>
);
}
}
//fragment를 적용한 출력 결과
<table>
<tr>
<td>Hello</td>
<td>World</td>
</tr>
</table>
constructor(props){super(props);}
,this
는 작성하지 않아도 된다.setState
안에 새로운 state를 return해주는 함수를 넣어준다.prevState
를 사용할 수 있다는 장점이 있다. this.setState((prevState) => {
return {
result: `${prevState.value} : 정답입니다.`
first: Math.ceil(Math.random() * 9),
second: Math.ceil(Math.random() * 9),
value: '',
};
})
//prevState = 예전 state
setState
를 하면 render()함수가 다시 실행된다. (state가 바뀔 때마다 렌더링이 다시 된다는 것이다.) this.Input = React.createRef();
focusInput = () => {
this.Input.current.focus();
}
render() {
return (
<>
<input type="text" ref={this.Input} />
</>
)
}
const GuGuDan = () => {
const [first, setFirst] = React.useState(Math.ceil(Math.random() * 9));
const [second, setSecond] = React.useState(Math.ceil(Math.random() * 9));
const [result, setResult] = React.useState('');
const [value, setValue] = React.useState('');
const inputRef = React.useRef(null);
const onSubmit = (e) => {
e.preventDefault();
if(parseInt(value) === first * second) {
setResult(value + '정답입니다.');
setFirst(Math.ceil(Math.random() * 9));
setSecond(Math.ceil(Math.random() * 9));
setValue('');
inputRef.current.focus();
} else {
setResult('땡');
setValue('');
inputRef.current.focus();
}
}
const onChange = (e) => {
setValue(e.target.value);
};
return (
<>
<div>{first} 곱하기 {second}는 ?</div>
<form onSubmit={onSubmit}>
<input ref={inputRef} type="number" value={value} onChange={onChange} />
<button type="submit">입력</button>
</form>
<div>{result}</div>
</>
)
}
//React.useState('초기값을 넣어준다.');