React/Hooks
setState의 파라미터에 반드시 함수를 넣어야 하는 경우
Socratone
2021. 11. 13. 22:19
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 함수의 인자에 함수를 넣어야 한다.
그래야만 함수에서 받는 인자가 이전의 값임을 장담할 수 있다.
이전의 값에 의존할 필요가 없는 경우에는 쓸데없이 코드가 길어지니 불필요하다.