inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

처음 배우는 리액트 네이티브

useState

setState 함수의 동작에 대해 질문있습니다(3)

219

Rancho Kim

작성한 질문수 3

0

아래 코드를 실행하고 찍힌 로그를 확인하면 다음과 같습니다.

const Counter = () => {
  const [count, setCount] = useState(0);
  return (
      <>
        <StyledText>count : {count}</StyledText>
        <Button title='+' onPress={() => {

          console.log('set 카운트1 전 count : ' + count);
          setCount(count =>   {
            console.log('count1 : ' + count);
            return count + 1
          });
          console.log('set 카운트1 후 count : ' + count);
          setCount(count =>   {
            console.log('count2 : ' + count);
            return count + 1
          });
          console.log('set 카운트2 후 count : ' + count);



        }}/>
      </>
  )

}

set 카운트1 전 count : 0 count1 : 0 set 카운트1 후 count : 0 set 카운트2 후 count : 0 count2 : 1 set 카운트1 전 count : 2 set 카운트1 후 count : 2 set 카운트2 후 count : 2 count1 : 2 count2 : 3 set 카운트1 전 count : 4 set 카운트1 후 count : 4 set 카운트2 후 count : 4 count1 : 4 count2 : 5

질문 :

count1 : 0 로그가 찍힌걸로 보아 첫번째 setCount가

실행이 되었으므로 count가 1로 바뀌어야하고

그 이후에 실행된 set 카운트1 후 로그는 count가 1이 되어야 맞을 것 같은데 그렇게 찍히지가 않았습니다.

그 이유가 궁금합니다.

 

javascript react-native

답변 1

0

김범준

안녕하세요,

 

이전 질문에 대한 답변으로 충분히 해결 되었으리라 생각합니다.

다시 한 번 정리해드리면,

 

  • 상태 변경 함수는 비동기적으로 동작합니다. 그래서 함수를 호출했다 하더라도 상태 변수에 바로 반영되지 않습니다.

  • 상태가 변경되면 리렌더링 됩니다. 그래서 리렌더링 되기 전에는 변경된 상태를 확인할 수 없습니다.

  • 비동기적으로 동작하는 상태 변경 함수의 문제를 해결하는 방법은, 파라미터로 함수를 전달하는 함수형 업데이트 입니다.

  • 전달된 함수의 파라미터로는 이전 상태 변수의 값이 전달되며, 만약 상태 변경 함수를 통해 변경을 한적이 있다면, 아직 반영되지 않았더라도 변경 예정인 값이 전달됩니다.

 

추가로, 컴포넌트 최상단에 console.log를 작성해서 리렌더링과 그때의 상태를 확인하면 조금 더 편하게 변경되는 상태를 확인할 수 있습니다.

그리고, 함수형 업데이트에 작성한 코드를 count로 하지 않고 prev로 하면 조금 덜 헷갈리게 확인할 수 있습니다.

0

김범준

추가로, 아직 강의 초반인데 useState가 조금 더 궁금하다면,

섹션6 2번째 강의에서 useState를 조금 더 자세하게 설명하니, 이 강의를 확인해 보시기 바랍니다.

맥북 m4에서 nvm으로 설치불가

0

119

2

expo 사용하지 않고 앱 실행 시, 데이터 불러오기

0

350

1

리덕스강의는 없나요?

0

275

1

선생님 도와주세요 ㅠㅠ (로그인, 회원가입, 콘솔 에러)

0

507

1

버젼 업데이트

0

428

1

expo start중 metro bundler가 같이 실행되지 않아요

0

505

1

모바일 expo 실행오류

0

854

1

안드로이드에서 expo실행이 안되요

0

852

2

터미널 다운 및 사용방법

0

297

1

expo init 에러

0

744

2

안녕하세요. 스택네비게이션 문제 질문드립니다 ㅜ

0

327

1

배포중 에러 해결이 안되네요.. ㅜㅜ

1

3230

1

안녕하세요! 강의 Chat App - Part 1 회원가입 부분에서 firebase 관련 에러가 납니다.

0

695

1

styled-components 에러

0

405

1

OS 네이트브 코드를 개발하면서 UI 를 리액트 네이티브로

0

494

1

저장하면 바뀐값들 보여야하는데 재렌더링이 안일어납니다..

0

506

1

안드로이드스튜디오 EXPO 어플 튕깁니다 ㅠㅠ

0

288

1

styled component를 사용하면 터집니다 ㅠㅠ

0

414

1

attrs, 속성, props 가 혼란스럽습니다.

0

352

1

안녕하세요, 강의 잘 들었습니다 :) RN과 파이어베이스 관련해서 질문드릴게 있습니다!

0

586

1

자꾸 The request timed out 에러가 뜹니다 .

0

1939

1

코드 좀 봐주세요 버튼 두개가 생성이 안되요

0

284

1

expo 실행시 스타일 속성 바로 보려면 어디서 보나요?

0

434

1

자바스크립트 () => 의미는요???

0

448

2