웹 게임을 만들며 배우는 React 1강 강의 내용을 정리한 포스팅입니다.
https://www.inflearn.com/course/web-game-react
리액트는 SPA(single page Application)
1) 사용자 경험
2) 재사용 컴포넌트 (중복되는 요소들을 하나로 묶어줄 수 있다.)
3) 데이터-화면 일치
JSX : (JS + XML)
React.Fragement
로 감싸주어 표현할 수 있다.과거 방식
render() {
return (
<div>
<div>
</div>
</div>
)
}
현재 방식
render() {
return (
<React.Fragment>
<div>
</div>
</React.Fragmet>
)
}
render() {
return (
<>
<div>
</div>
</>
)
}
class 내부 함수에서
화살표 함수
가 아닌 function으로 함수 선언식을 사용한다면this
접근 범위가 달라지기 때문에화살표 함수
를 사용한다.
constructor(props) {
super(props);
this.state = {
value = '',
}
}
위의 로직이 반드시 필요한 것이 아니다. 실무에서는 아래와 같이 많이 표현한다.
state = {
value = '',
}
현재 상태와 미래의 상태를 분리
기존 코드
onSubmit = (e) => {
e.preventDefalut();
if (parseInt(this.state.value) === this.state.first = this.state.second) {
this.setstate({
result: '정답' + this.state.value,
})
}
}
개선 코드
onSubmit = (e) => {
e.preventDefalut();
if (parseInt(this.state.value) === this.state.first = this.state.second) {
this.setstate((prevState) => {
return {
result: '정답' + this.prevState.value, // 새로운 상태 값
}
})
}
}
예전 상태 값을 다음 상태 값에 적용을 할 수 있다. 즉 명시적으로 표현이 가능하다.
setState
는 비동기 처리이다. 한 가지 원칙 예전 값을 기준으로 새로운 값을 만드는 경우에는 개선 코드와 같이 리턴을 해주는 함수를 사용하는 것으로 약속을 해야한다.
input; // ref를 위한 변수
render() {
return (
<React.Fragment>
<form onSumbit={this.onSubmit}>
<input ref={(c) => { this.input = c; } type = 'number' value={this.state.value} onChange={this.onChange}}/>
<button>입력</button>
</form>
</React.Fragment>
)
}
setState를 즉, 상태 변경이 일어나게 되면 Render() 함수가 실행된다.
Render()
너무 많이 일어나게 되면 화면 변화가 생기는 것이므로 성능 저하가 일어난다.
class 컴포넌트에서 함수를 밖으로 빼는 이유도 렌더가 너무 많이 실행 되기 때문이다.
Ref
hooks 에서는 useRef를 통해 DOM에 접근한다. 이때 current
를 명시해준다.const GuGudan = () => {
const [first, setFirst] = React.useState(Math.ceil(Math.random() * 9));
const [second, setSecond] = React.useState(Math.ceil(Math.random() * 9));
const [value, setValue] = React.useState('');
const [result, setResult] = React.useState('');
const inputRef = React.useRef(null);
const onChangeInput = (e) => {
setValue(e.target.value);
}
const onSubmitForm = (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();
}
}
return (
<React.Fragment>
<div>{first} 곱하기 {second}</div>
<form>
<input ref={inputRef} onChange={onChangeInput} value={value}></input>
</form>
<div id="result">{result}</div>
</React.Fragment>
)
}
주의 ❗️
React 컴포넌트에서는 태그 내부에 class가 아닌 className
으로 사용해야한다. class를 혼동할 수 있기 때문이다.
그와 더 for 속성을 htmlFor 속성으로 표기해주어야한다.
ex) for → labelFor
React에서 사용할 수 없는 속성은 class와 for이 있다.
useState에서 상태를 설정하는 데에는 제한이 없다. 다만 객체를 선언했을 시에 부분 상태 변경에 어려운이 있다.
SetState는 SetState를 모아서 한번에 처리한다. 즉 상태변화를 한번에 처리한다.
Ref와 useRef hooks에 대해서 배울 수 있었다.