react useState 실행순서에 대해서 질문드립니다.
459
작성한 질문수 2
import React,{useState} from 'react';
function Exptest (){
const [number, setNumber] = useState('A');
const checkNumber =() =>{
alert("첫번째 "+number);
setNumber(function (prevnumber){
alert(prevnumber+"/3번/"+number);
setNumber((prevnumber)=>{
alert(prevnumber+"/4번/"+number);
return prevnumber+'B';
});
return prevnumber+'C';
});
alert("두번째"+number);
};
return (
<>
<button onClick = {checkNumber}> {number} </button>
</>
);
};
export default Exptest;
/*
이런식으로 안쓰는건 알지만 실행순서에 대해서 공부하다 이것저것 해보다가 이해가 안가서 질문드립니다.
질문1.
처음 버튼 클릭 시 number='A' -> number = 'AC' 이렇게 업데이트된다.
그리고 두번 째 실행 시 결과는 number = 'ACCB' 가 되는데 왜 처음엔 B를 추가하지 않나요?
질문2.
alert 메세지가 뜨는 순서를 보면 처음 버튼 클릭 시
첫번째 A -> A/3번/A -> A/4번/A -> 두번째 A
그리고 두번 째 버튼 클릭 부터는
첫번째 AC -> 두번째 AC -> AC/3번/AC -> ACC/4번/AC
이렇게 메세지가 뜨는데 왜 순서가 달라지나요?
*/
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
님의 질문에 관한 답변은 다음과 같습니다.
질문1에 대한 답변:
React의 useState와 관련된 업데이트는 비동기적으로 실행됩니다. 초기 클릭 시 setNumber를 체이닝하여 호출하게 되면, React는 성능 최적화를 위해 여러 상태 업데이트를 배치(Batch) 처리합니다. 첫 번째 클릭에서 ‘B’를 추가하지 않는 이유는, 첫 번째 setNumber 호출에서 반환한 값(‘AC’)만이 다음 상태 업데이트에 반영되고, 내부 setNumber 호출은 다음 렌더링 사이클에서 처리되기 때문입니다. 그래서 ‘B’가 바로 추가되지 않고, 두 번째 클릭 시점에서 ‘B’가 추가됩니다.
질문2에 대한 답변:
첫 번째 버튼 클릭 시 뜨는 메시지 순서는 React가 상태 업데이트를 배치 처리하는 방식 때문에, 상태 업데이트(setNumber)가 즉시 반영되지 않습니다. 이로 인해 alert가 호출될 때 number 상태는 아직 업데이트되지 않은 상태를 참조합니다. 다른 편, 두 번째 버튼 클릭부터는 첫 번째 setNumber 호출이 배치 처리되어 업데이트되고, 이후 alert가 실행될 때는 업데이트된 상태를 참조할 수 있게 되므로, number 상태가 변경된 후의 값을 보여주게 됩니다. 이러한 차이로 인해 메시지가 뜨는 순서가 달라집니다.
React의 상태 업데이트 메커니즘과 비동기 처리 로직의 이해를 돕기 위해서는, 공식 문서에서 제공하는 훅 관련 문서와 자바스크립트의 비동기 처리 방식에 대해 추가적으로 공부하는 것이 좋습니다.
Claude / 터미널 기본명령어
0
14
4
gitignore에 로컬 셋팅 반영 안됨 이슈
0
10
2
git 연동
0
12
1
60강 .claude -> rules (memory)
0
20
1
Plan 모드 활성화 상태에서 해당 모드가 정상 동작 하지 않습니다.
0
20
1
풀라우트캐시 동작 원리에서 데이터 캐시 관련 질문
0
20
2
prd-generator.md 서브에이전트 생성 오류
0
16
1
프롬프트 작성시 " \ " 관련 질문
0
27
2
미션9 user memory 누르면 메모장이 뜹니다.
0
23
2
Cursor 터미널에서 스크린 복붙이 안되요
0
28
2
미션 7 관련 url 접속이 안되어 문의드립니다.
0
21
2
plan 모드가 동작하지 않습니다.
0
23
2
next.js 프로젝트
0
24
1
mac 클로드 코드 설치 후 오류
0
26
2
몽고 db 접속 오류
0
18
1
92~93강 프롬프트 서브에이전트 공유
0
29
2
데스크톱IDE채팅창 VS 데스크톱IDE 터미널
0
23
1
안티그래비티 확장프로그램
0
26
2
cd 명령어가 안들어요
0
24
2
클로드 데스크앱과의 차이
0
29
1
nmp run build의 기능
0
23
2
plan mode 개발 계획안 확인 불가
0
25
3
명시적 타입 선언(콜론 타입 선언)과 as 타입 단언 차이
0
20
2
max x5 플랜을 결제했습니다.
0
32
2





