const [count, setCount] = useState(0);
<- value의 현재상태(초기값)을 0으로 지정숫자를 count(+-)한 값과 input에 입력된 값을 state에 저장하는 과정을 클래스형 컴포넌트와 hook(useState)를 이용한 함수형 컴포넌트로 구현하여 서로 비교해보았다.
class App extends Component{
state = {
count : 0
}
modify = (n) => {
this.setState({count : n});
}
uploadInput = (e) => {
const {target:{value}} = e;
this.setState({email: value});
console.log(this.state.email);
}
render(){
const {count} = this.state;
return(
<div>
{count}
<button onClick={() => this.modify(count + 1)}>Increment</button>
<button onClick={() => this.modify(count - 1)}>Decrement</button>
<input onChange={this.uploadEmail} placeholder="Email" value={this.state.email}/>
</div>
)
}
}
//원래는 함수형 컴포넌트에서 state, lifeCycle를 사용할 수 없었지만,
//이후 hook을 이용하여 state, lifeCycle를 사용할 수 있게 되었다.
const App = () => {
const [count, setCount] = useState(0);
const [email, setEmail] = useState("");
const updateEmail = e => {
const {target:{value}} = e;
setEmail(value);
}
return(
<div>
{count}
<button onClick={() => setCount(count + 1)}>Increment</button>
<button onClick={() => setCount(count - 1)}>Decrement</button>
<input onChange={updateEmail} placeholder="Email" value={email}/>
</div>
)
}
[함수형 컴포넌트에서 this를 쓰지 않는 이유]
함수형 컴포넌트의 상태값은 useState훅으로 관리되기 때문에 컴포넌트의 this로부터 자유롭다. 또한 함수형 컴포넌트 자체와 함수형 컴포넌트 안에서 선언한 함수들 모두 전역 객체를 this로 가지기 때문에 애초에 this가 다 같다. 그래서 이벤트 핸들러에 콜백 함수를 넘기는 상황에도 딱히 신경 쓸 필요가 없다.