useState 훅을 이용하면 state와 setState 함수를 얻을 수 있다.
const [state, setState] = useState(0);
setState 함수에 값을 넣으면 리액트 컴포넌트가 리렌더링 되고 state 값을 바꾼다.
setState(1);
그러나 간혹 setState 함수에 함수를 넣는 경우가 있다.
setState((state) => state + 1);
이전의 state 값을 불러와서 1을 더한다는 뜻이다.
아래와 별반 다를 게 없을 것 같다.
const [state, setState] = useState(0);
/* ... */
setState(state + 1);
useState에서 받는 state 값도 이전의 값일 것이기 때문이다.
그러나 state가 여럿일 경우에 다른 state의 변화로 리렌더링이 거의 동시에 이루어지거나 하게 되면
useState 왼쪽의 state가 이전의 값임을 보장할 수 없을 때가 있다.
이는 state의 변화가 비동기적으로 일어나기 때문이다. (scheduler에 대해서 알아보기)
setState가 호출되면 바로 state가 바뀌는 게 아니라
리액트에게 변경해야할 state를 알려주는 것이고
리액트는 다른 state의 변경 요청까지를 다 받은 다음
한 번에 묶어서 state를 변경하여 리렌더링시킨다.
(promise나 setTimeout 등을 제외하고 그 안에 실행된 모든 state들을 하나로 묶는다.)
때문에 1을 더하는 것과 같이 state의 업데이트가 이전의 값에 의존하는 경우
반드시 setState 함수의 인자에 함수를 넣어야 한다.
그래야만 함수에서 받는 인자가 이전의 값임을 장담할 수 있다.
이전의 값에 의존할 필요가 없는 경우에는 쓸데없이 코드가 길어지니 불필요하다.
'React > Hooks' 카테고리의 다른 글
React memo, useCallback 올바로 사용하기 (0) | 2021.12.16 |
---|---|
React Query를 이용해서 API를 쉽게 연동하는 방법 (0) | 2021.07.13 |
React Query 기본 (1) | 2021.04.27 |
React Hooks의 State 동작 원리 (2) | 2021.04.17 |
React.memo 번역 (0) | 2020.06.14 |