Posts State as a snapshot
Post
Cancel

State as a snapshot

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

요약

💡 상태(State) 변수는 일반적인 JavaScript 변수처럼 읽고 쓸 수 있는 변수로 보이지만, 상태는 스냅샷과 유사한 방식으로 작동합니다. 상태를 설정하면 이미 가지고 있는 상태 변수가 변경되는 것이 아니라, 다시 렌더링을 트리거합니다.

사실

  • 상태를 설정하면 다시 렌더링이 트리거됩니다.
  • 렌더링은 시간상의 스냅샷을 촬영합니다.
  • 상태 변수의 값은 렌더링 내에서 변하지 않습니다.
  • 상태 업데이터 함수를 사용하여 최신 상태를 읽을 수 있습니다.

렌더링은 시간상 스냅샷을 촬영합니다

  • 리액트가 컴포넌트를 호출하면, JSX를 반환함.
  • 반환하는 JSX는 해당 시점의 UI 스냅샷과 유사합니다. 상태를 사용하여 계산된 props, 이벤트 핸들러 및 로컬 변수를 포함합니다.
  • 반환된 UI “스냅샷”은 상호작용 가능하며, 이벤트 핸들러와 같은 로직을 포함합니다.
  • React는 화면을 업데이트하여 이 스냅샷과 화면을 일치하게하고 이벤트 핸들러를 연결합니다.
  • 리렌더 과정
    • 리액트가 컴포넌트를 다시 호출함
    • 컴포넌트가 새로운 JSX snapshot을 반환함
    • 리액트가 반환된 snapshot에 맞춰 화면을 업데이트함.

상태는 렌더링 내에서 “고정”됩니다

  • 상태는 함수가 반환되고 나서 사라지는 일반 변수와 달리 React 자체에서 “살아있습니다”. (컴포넌트 외부에서)
  • React는 상태를 가지고 있다가 컴포넌트를 호출할 때, React는 컴포넌트에게 해당 렌더링의 state snapshot을 제공합니다.
  • 이 상태 값을 사용하여 계산된 props 및 이벤트 핸들러를 사용해서 UI snapshot을 반환합니다.

상태 업데이트는 다음 렌더링을 위해 변경합니다

  • 상태 업데이트는 다음 렌더링을 위해 변경됩니다.
  • 첫 번째 렌더링 중에 상태는 변하지 않습니다.
  • 예시 코드에서 “number” 상태 변수는 처음 렌더링에서 0입니다.
    1
    2
    3
    4
    5
    
    <button onClick={() => {  
      setNumber(number + 1);  
      setNumber(number + 1);  
      setNumber(number + 1);  
    }}>+3</button>
    
  • 이로 인해 첫 번째 렌더링의 onClick 핸들러 내에서도 “number” 값이 여전히 0입니다.
  • 따라서 위 예제에서는 setNumber(0 + 1)을 세번 하는 것이므로, 버튼을 눌러도 1씩만 number가 올라간다

상태 값은 렌더링 내에서 고정됩니다

  • 상태 변수의 값은 렌더링 내에서 변경되지 않습니다. 이벤트 핸들러 내에서 비동기 코드를 사용하는 경우에도 마찬가지입니다.
  • 이전에 생성된 이벤트 핸들러는 그 당시 생성된 렌더링의 상태 값(state snapshot)을 가집니다.
  • 아래 예제는 버튼 클릭시 3초 후에 업데이트 되기 전 숫자를 alert으로 띄운다.
    1
    2
    3
    4
    5
    6
    
    <button onClick={() => {
          setNumber(number + 5);
          setTimeout(() => {
            alert(number);
          }, 3000);
        }}>+5</button>
    

#review

This post is licensed under CC BY 4.0 by the author.