inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

처음 만난 리액트(React)

이벤트 실행순서에 대해 질문드려요

256

ccct

작성한 질문수 2

1


import React from 'react';
import {useState} from 'react';

function ConfirmButton2 (){
    
    const [isConfirmed,setIsconfirmed] = useState(false);
    const handleConfirm = ()=>{
        setIsconfirmed((prevIsConfirmed) => !prevIsConfirmed);
        // setIsconfirmed(!isConfirmed);
    };

    const [number, setNumber] = useState(0);
    const checkNumber =() =>{

        alert("첫번째 "+number); // 0 
        setNumber((prevnumber)=>{
            alert(prevnumber+"//"+number); // 0 0
            return prevnumber+10;
        });
        setNumber((prevnumber)=>{
            alert(prevnumber+"//"+number); // 10 0
            return prevnumber+10;
        });
        alert("두번째"+number); // 0 
    };

    return (
        <>
        <button onClick = {handleConfirm} >
                {isConfirmed ? "확인됨2" : "확인하기2"}
        </button>
        <button onClick = {checkNumber}>
            {number} 
        </button>
        </>
    );
    

};

export default ConfirmButton2;

이렇게 해서 실행을 하고 숫자 버튼을 클릭하면
첫번째 alert -> set함수 alert -> 두번째 alert -> 두번째 set함수 alert 
이 순서로 나오는데, 
alert ->  set 함수 alert -> 두번째 set함수 alert -> 두번째 alert 이 순서가 아닌 이유를 모르겠어요.

javascript react

답변 2

0

Inje Lee (소플)

안녕하세요, 소플입니다.

 

우선 리액트 컴포넌트에서 state의 업데이트는 조금 복잡한 과정을 거치게 됩니다.

일반적으로 리액트는 state 업데이트를 처리하기 전에 이벤트 핸들러의 모든 코드가 실행될 때까지 기다립니다.

그렇기 때문에 지금 겪으신 것처럼 작성한 코드의 순서대로 실행되지 않는 경우가 많습니다.

 

그리고 이러한 특징 때문에 state를 업데이트 할 때,

하나의 set함수를 하나의 이벤트 핸들러에서 동시에 호출하는 형태로는 코드를 작성하지 않는게 좋습니다.

 

추가로 아래 공식문서를 살펴보시면 조금 더 자세하게 이해하실 수 있을겁니다 😀

https://react.dev/learn/state-as-a-snapshot

https://react.dev/learn/queueing-a-series-of-state-updates

 

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

질문하신 이벤트 실행순서에 대한 현상은 React의 상태 업데이트 방식과 비동기적인 처리 때문입니다.

React에서 useState의 상태 업데이트 함수인 setNumber는 비동기적으로 작동합니다. 즉, setNumber를 호출하더라도 상태 값이 바로 변경되지 않고, 컴포넌트의 다음 렌더링 시점에 변경된 상태를 반영합니다. 따라서, 여러분이 작성하신 코드에서 alert("두번째"+number); 가 먼저 실행될 때는 아직 상태 값이 업데이트되기 전이기 때문에 초기 상태 값을 보여줍니다.

그리고 setNumber 함수 내부에서 사용된 콜백 함수는 이전 상태 값을 인자로 받아서 새로운 상태 값을 반환합니다. 이 콜백 함수는 바로 이전 상태를 기반으로 연산하기 때문에 연속된 setNumber 호출에서는 첫 번째 setNumber 호출에 의해 예정된 상태 변경을 기반으로 연산됩니다.

정리하자면, setNumber의 콜백에서 각각 다른 현재 상태를 기반으로 계산하게 되는데, 실제 상태 값의 변경은 비동기적으로 이루어지기 때문에 alert("두번째"+number);에서는 변경되기 전의 초기 상태 값을 보게 되는 것입니다.

이 특성 때문에 여러분이 경험한 것처럼 alert -> set 함수 alert -> 두번째 set함수 alert -> 두번째 alert 순서대로 출력되지 않는 현상이 발생합니다.

강의가 삭제되었다고 합니다

0

107

1

이거 왜 존재하지 않는다고 뜨는건가요

0

134

1

존재하지 않는 수업이라고 떠요

0

184

1

안드로이드 에뮬레이터 오류

0

100

1

교재 구입해서 강의 들으려고 하는데 커리큘럼이 없어졌어요.

0

127

1

prevIsConfiromed 질문

1

142

2

chapter14 잘이해가 되지않습니다..

1

136

2

2025년 3월 리액트버전

1

203

2

npm 설치 오류

1

176

1

chapter_07 콘솔로그 질문드려요~!

1

128

2

안녕하세요 미니블로그 실습 질문드립니다.

1

179

3

에러가 떠요

1

219

3

Chapter6 질문 드립니다

1

210

2

실습 코드 있을까요?

1

207

2

상태가 업데이트될때 컴포넌트 최상단의 console.log 코드가 두번 실행되는 이유가 궁금합니다.

1

233

2

npx create-react-app my-app 명령어 입력이 잘못된 것 같습니다

0

308

3

이름과 코멘트 줄바꿈이 안 됩니다.

0

141

1

버튼이 안 뜹니다

0

304

2

npx create-react-app my-app

1

471

2

jsx 코드 작성해보기에서 index.js 수정 후 에러 뜹니다.

1

377

3

Chapter_05 터미널, 리액트 에러

0

194

2

npx create-react-app my-app 명령어 반응없음

1

433

3

import 코드 에러

1

215

1

백틱

1

122

1