State는 컴포넌트의 인스턴스별로 나뉘어져 있다.
Javascript를 예시로 들어보면, 생성자 함수로 생성한 객체를 인스턴스라고 생각하면 된다.
Constructor(생성자 함수) = 붕어빵 틀
Instance(생성자 함수로 만들어진 객체) = 붕어빵
useState
는 비동기적으로 동작한다.setState
가 호출되면, 마지막에 실행한 setState가 실행되어 렌더링 된다.const somethingHandler [state, setState] = useState()
Q. 이 코드가 동기적이라면 어떻게 작동하고, 비동기적이면 어떻게 작동해야 하는가?
const [count, setCount] = useState(0)
const countHandelr = () => {
setCount(prev + 1)
setCount(prev + 2)
}
A. 만약 동기적이라고 하면 순차적으로 함수가 실행되어 count에 3씩 더해져서 핸들러가 실행될 때 마다 3, 6, 9 ... 3의 배수로 커질 것이다.
하지만 useState는 비동기적으로 작동하고, 동일한 state를 연속적으로 처리하는 업데이트하는 경우에는 변경사항을 모아서 한 번에 일괄처리(batch)하게 된다.
최종적으로 한 번만 setState를 실행하게 되고, 마지막 setCount(prev + 2)
함수만 실행될 것이다.
일괄적인 batch update를 통해서 컴포넌트의 렌더링 횟수를 최소화할 수 있게 된다.
이로써 불필요한 렌더링을 방지하고, 더 빠른 속도로 동작할 수 있다.
⭐️ useState 특징 기억하기
- 비동기적으로 동작한다.
- 동일한 state를 연속적으로 처리하는 업데이트하는 경우에는 변경사항을 모아서 한 번에 일괄처리(batch)하게 된다.
- 최종적으로 동일한 setState가 호출되면 한 번만 setState를 호출하고, 마지막 함수만 실행하게 된다.
- 일괄적인 batch update를 통해서 컴포넌트의 렌더링 횟수를 최소화할 수 있게 된다.
이로써 불필요한 렌더링을 방지하고, 더 빠른 속도로 동작할 수 있다.