useState
useReducer
useContext
Class-based components
class ClassComponent extends Component {
constructor(props) {
super(props);
this.state = {
count: 0,
};
}
incrementCount = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
<div>
<h1>클래스 컴포넌트 예시</h1>
<p>카운트: {this.state.count}</p>
<button onClick={this.incrementCount}>증가</button>
</div>
);
}
}
Functional components
import React, { useState } from 'react';
function FunctionalComponent() {
const [count, setCount] = useState(0);
const incrementCount = () => {
setCount(count + 1);
};
return (
<div>
<h1>함수 컴포넌트 예시</h1>
<p>카운트: {count}</p>
<button onClick={incrementCount}>증가</button>
</div>
);
}
export default FunctionalComponent;
import React, { useState } from 'react';
const [state, setState] = useState(initialState);
state
: 현재 상태값 변수, initialState로 초기화setState
: 상태값을 업데이트해주는 Setter 함수initialState
: 상태의 초기 값, 처음 렌더링될 때만 사용이전 상태 덮어쓰지 않는다.
매번 새로운 상태 설정
const [state, setState] = useState({ count: 0, title: 'Hello' });
setState({ count: 1 }); // title은 사라진다.
// 이전 상태 통째로 복사 후 변경하고자 하는 부분만 업데이트하는 방식
setState(prevState => ({ ...prevState, count: 1 }));
// { count: 1, title: 'Hello' }가 된다.
setState
함수 호출 시 즉시 업데이트 X
성능 최적화를 위해 여러 상태 업데이트를 한 번에 처리
const [age, setAge] = useState(20);
function handleClick() {
setAge(age + 1);
console.log(age); // 아직 20
}
function handleClick() {
setAge(a => a + 1); // setAge(20 => 21)
setAge(a => a + 1); // setAge(21 => 22)
setAge(a => a + 1); // setAge(22 => 23)
}
→ 대기중인 state 가져와서 다음 state 계산
훅을 다루기 이전에 클래스형 컴포넌트와 함수형 컴포넌트의 차이부터 다뤄주셔서 이해에 도움이 됐어요.
setState의 값이 바로 업데이트가 되지 않는 부분은 set함수에 콜백함수를 넣어주면서 해결할 수 있다고 하네요!
유용한 아티클 잘 보고 갑니다 :)