Function? Class?
리액트는 함수형 컴포넌트(Functional Component)와 클래스형 컴포넌트(Class Component)로 나누어집니다. 함수형 컴포넌트로 작성 시에 코드가 매우 짧아지게 되는데, 알아보도록 하겠습니다.
클래스형 컴포넌트
- state기능 및 라이프사이클 기능을 사용할 수 있고 임의 메서드를 정의할 수 있다.
- render 함수가 꼭 있어야 하고, 그 안에서 보여 주어야 할 jsx를 반환해야 한다
import React from "react"
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
first: Math.ceil(Math.random() * 9),
second: Math.ceil(Math.random() * 9),
value: "",
result: "",
}
}
onSubmit = () => {
e.preventDefault()
if (parseInt(this.state.value) === this.state.first * this.state.second) {
this.setState((prevState) => {
return {
result: `정답: ${prevState.value}`,
first: Math.ceil(Math.random() * 9),
second: Math.ceil(Math.random() * 9),
value: "",
}
})
} else {
this.setState({
result: "땡",
value: "",
})
}
this.input.focus()
}
onChange = (e) => this.setState({ value: e.target.value })
render() {
return (
<React.Fragment>
<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>
<div>{this.state.result}</div>
</form>
</React.Fragment>
)
}
}
함수형 컴포넌트
- 선언하기가 간편하다.
- 메모리가 클래스형 컴포넌트보다 덜 사용한다.
import React,{useState, useRef} from 'react';
class App extends React.Component {
const [first, setFirst] = useState(Math.ceil(Math.random() * 9));
const [second, setSecond] = useState(Math.ceil(Math.random() * 9));
const [value, setValue] = useState('');
const [result, setResult] = useState('');
const inputEl = useRef(null);
const onSubmitForm = (e) => {
e.preventDefault();
if (parseInt(value) === first * second) {
setResult('정답');
setFirst(Math.ceil(Math.random() * 9));
setSecond(Math.ceil(Math.random() * 9));
setValue('');
inputEl.current.focus();
} else {
setResult('땡');
setValue('');
inputEl.current.focus();
}
};
return (
<>
<div>{first} 곱하기 {second}는?</div>
<form onSubmit={onSubmitForm}>
<input
ref={inputEl}
type="number"
value={value}
onChange={(e) => setValue(e.target.value)}
/>
<button>입력!</button>
</form>
<div id="result">{result}</div>
</>
);
}
다음과 같이, 같은 코드를 작성하더라도 함수형 컴포넌트로 작성 시에 코드량이 매우 줄어드는 것을 알 수 있습니다. 그리고 React의 공식문서에서도 가능하다면 함수형 컴포넌트와 Hook을 사용하기를 권장하고 있으니, 특별한 이유가 있지 않다면 함수형 컴포넌트로 작성하시면 되겠습니다.