Setinterval()로 state 갱신하기

Youje0·2022년 11월 17일
0

setState(count + 1); // 계속 state가 1로 고정

setState(count => count + 1); // updater function을 이용하면 계속 갱신가능










리액트 권위자(?) Dan Abramov에 의하면, 이 현상은 setInterval과 리액트의 근본적인 차이에 기반한다.

리액트 컴포넌트의 props와 state는 계속해서 변화할 수 있다.

이 때 리액트 컴포넌트는 저번 렌더링 상태를 모두 잊어버리고, 새로운 상태를 가지고 다시 렌더링한다.

반면 setInterval은 한 번 설정되면 clearInterval을 하는 것 말고는 아무런 변경을 할 수가 없다.

그래서 interval 타이머를 직접 갈아주지 않는 이상, 처음의 props와 state를 계속 참조하고 있는 것.

 

setCount(count => count + 1)처럼 updater function을 사용해서 setCount를 해주면 문제는 해결된다.

updater function을 사용하면 항상 신선한(fresh) 상태값을 가져올 수 있기 때문.

 

* setState는 비동기로 동작한다.

때문에, 한 번에 여러 개의 setState를 사용하면 그 update들을 모두 queue에 담았다가,

더 이상 setState가 없을 때 queue에 있는 모든 update들을 실행시키고, 이후에 리렌더링이 실행된다.

아마 쓸데없는 렌더링을 줄이고, 모든 변화를 반영한 한 번의 렌더링으로 효율성을 높이기 위한 것이리라.

그래서 여러 번의 setState를 사용할 때, 순서대로 변경이 일어나게 하기 위한 방법으로 

'updater function' 형식이 사용된다. setState 내부에 콜백 함수를 사용해주는 것.
profile
ㅠㅠ

0개의 댓글