Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 백준 4796 javascript
- 백준 11047 typescript
- 백준 2503 nodejs
- 백준 11047 javascript
- 백준 1449
- 백준 4796 캠핑
- 백준 1449 노드
- 백준 2503 javascript
- 백준 1449 nodejs
- 백준 4796 nodejs
- 백준 1018 javascript
- 백준 4796 자바스크립트
- 백준 1449 javascript
- 백준 2503 typescript
- 백준 1449 자바스크립트
- 백준 1018 타입스크립트
- 백준 10448 javascript
- 백준 11047 자바스크립트
- 백준 1449 타입스크립트
- 백준 11047 타입스크립트
- 백준 11047 nodejs
- 백준 1018 자바스크립트
- 알고리즘
- 백준 1018 nodejs
- 백준 1018 typescript
- 백준 2503 자바스크립트
- JavaScript
- CSS
- 백준 4796 타입스크립트
- 백준 2503 타입스크립트
Archives
- Today
- Total
POTATO THAT WANT TO BE HUMAN
[React] 반복문에서 setState? 본문
반응형
나 : 배열 길이만큼 for문 돌리면서 배열의 값을 state 변수에 저장할게 !!
현실 : 되겠냐 ㅋㅋ
🔎 원인을 알아보자
state 값을 변경시켜주는 setState()는 비동기이기 때문 !
즉각적으로 상태를 업데이트 시켜준다면 반복문 내에서도 사용이 가능하다.
하지만
setState()
는 Promise
를 이용해 비동기적으로 상태를 변화시키기 때문에 생각처럼 작동하지 않는다.
더 자세히 알아보면,
setState()
를 호출하게 되면 UpdateQueue에 업데이트 요청이 큐잉되고 비동기적으로 하나씩 처리한다.
이 업데이트 요청이 완료되기 전에 새로운 업데이트 요청이 들어오게 되면 업데이트 전의 값을 기준으로 다시 큐잉되게 한다.
그렇다.
for문 안에서 setState()
로 업데이트 요청을 했는데 처리가 되기도 전에 계속해서 업데이트 요청이 들어오는 것이다.
업데이트큐에서는 업데이트를 처리하기도 전에 다음 요청이 계속해서 들어오게 되니 결국 업데이트 전의 값을 기준으로 하다가 마지막 요청만 받은 것으로 되어 state
에는 마지막 값만 들어가게 되는 것이다.
🧐 해결해보자
반복문 내에서는 setState
를 사용하지 않아야 하는 게 암묵적 룰 !
반복문을 통해 state
에 값을 넣고 싶다면 반복문 바깥에 변수를 하나 생성해주고 그 변수에 값을 넣어준 후 그 값을 setState()
해주면 된다. 쉬운 예로 보자.
해결 전
const [state, setState] = useState([]);
for(let i = 0; i < 3; i++) {
setState([...state, i]);
}
console.log(state); // [2]
해결 후
const [state, setState] = useState([]);
let arr = [];
for(let i = 0; i < 3; i++) {
arr.push(i);
}
setState(arr);
console.log(state); // [0, 1, 2]
반응형
'FRONTEND > React' 카테고리의 다른 글
[React] LiftCycle과 useEffect (0) | 2022.11.04 |
---|---|
[React]useCallback 과 useMemo 사용하기 (0) | 2022.10.06 |
[React] 리액트에서 쿼리스트링 값 가져오기 (useSearchParams) (0) | 2022.07.17 |
[React] child에서 parent의 함수로 event handler 등록하기 (0) | 2022.03.30 |
[React] 리스트와 key (0) | 2022.02.23 |
Comments