REACT

[React]비동기 처리되는 setState 함수

[React]비동기 처리되는 setState 함수

setState 함수의 비동기적 실행

리액트의 setState(변경) 함수는 전부 비동기적으로 실행됩니다. 그렇기 때문에 코드 실행시에 다음과 같이 예기치 못한 문제가 발생할 수 있습니다.

Commu
Thread와 비동기 비교하기동기적 프로그래밍은 테스크(Task)를 순차적, 직렬적으로 수행하도록 하여 어떤 테스크가 수행 중이면 다음 테스크는 대기하게하는 방식의 프로그래밍이다....

예제

버튼을 클릭하면 age에 +1을 하고 세번째 클릭시에는 +1을 하지 않도록 코드를 짭니다.

function App() {

  let [count, setCount] = useState(0);
  let [age, setAge] = useState(20);

  return (

          <div>안녕하십니까 전 {age}</div>
          <button onClick={()=>{
            setCount(count+1);
            if( count < 3){
              setAge(age+1)
            }
          }}>누르면한살먹기</button>
          </div>
       
  )
}

이렇게 짜면 3번째 클릭시에는 +1이 반영되지 않아야 할 것 같지만, setState 함수 즉, setCount(count+1); 부분이 비동기적으로 실행되기 때문에 다음 코드인 if문을 먼저 실행한 후에 실행합니다. 그래서 +1을 한 후에 count가 3이 되는 것이죠.

useEffect 함수를 사용하여 동기적 실행

위와 같은 코드의 경우 동기적으로 실행하는 것이 좋습니다. useEffect를 사용하면 state가 변경될 때 useEffect 내부의 코드를 실행할 수 있습니다.

function App() {

  let [count, setCount] = useState(0);
  let [age, setAge] = useState(20);

  useEffect(()=>{
    if( count !== 0 && count < 3){
      setAge(age+1)
    }
  },[count])


  return (

        <div>
          <div>안녕하십니까 전 {age}</div>
          <button onClick={()=>{
            setCount(count+1);
          }}>누르면한살먹기</button>
        </div>

  )
}

count 값이 변경될 때 setCount(count+1); 이 부분 코드가 실행되도록 작성했기 때문에 count가 3일때 count+1이 실행되지 않게 됩니다.

 

최신글