반복문 내에서 setState를 사용했더니, 데이터가 쌓이지 않고 마지막에 넣어준 데이터만 적용되었다.
문제 상황
- 반복문 내에 setState를 사용하여 데이터 축적 시도
- 그러나 데이터가 쌓이지 않고, 반복문에서 마지막 순서의 데이터만 입력되었다.
- 즉 반복문 조건이 0부터 i번째 까지라면, i번째의 데이터만 state에 입력되었다.
원인
- setState는 즉각적으로 상태를 업데이트 하지 않고, Promise를 통해 비동기적으로 상태를 변경시킨다.
- 반복문을 돌리는 과정에서 setState를 사용해도, 반복문이 끝나기 전까지는 State가 변경되지 않는다.
- 반복문을 돌려도 state가 바뀌지 않아서, 계속 초기 상태의 state를 사용하기 때문에 데이터가 축적되지 않는다.
const [state, setState] = useState([])
const testHandler = () => {
for (let i=0; i<4; i++) {
setState([...state, i])
}
}
console.log('state', state)
// state의 초기값은 빈 배열 : state=[]
// i=0 일 때, setState를 통해 state=[0] 으로 변경
// i=1 일 때, 여전히 state=[]이며, setState를 통해 [1] 로 변경
// i=2 일 때, 여전히 state=[]이며, setState를 통해 [2] 로 변경
// i=3 일 때, 여전히 state=[]이며, setState를 통해 [3] 로 변경
// 반복문을 돌면 state=[3] 이 된다.
해결방안
- 반복문 내에서는 setState를 사용하지 않는 것이 원칙이며, 반복문을 통한 결과물만 setState에 넣어주기
- 공식 문서에서도 반복문, 조건문, 중첩된 함수 내에서 Hook을 호출하지 말라고 함
- 링크 : https://ko.reactjs.org/docs/hooks-rules.html
반응형
'프로그래밍 > 웹 개발' 카테고리의 다른 글
[React] setTimeout, setState, useEffect 관계 (0) | 2021.11.11 |
---|---|
[React] setTimeout 내부 setState 사용 후 useEffect 동작 안 되는 에러 (0) | 2021.11.11 |
[React] useEffect 무한루프 탈출 (에러핸들링) (0) | 2021.11.10 |
[Axios/Fetch] 함수 내에서 AJAX 요청으로 받은 데이터를 리턴하기? (0) | 2021.11.09 |
[React] 이벤트 함수에 매개변수 전달 (에러핸들링) (0) | 2021.11.01 |
댓글