>웹 프론트엔드 >JS 튜토리얼 >setState 작업이 반응하는 비동기 작업인가요? 해결책

setState 작업이 반응하는 비동기 작업인가요? 해결책

DDD
DDD원래의
2024-12-21 03:15:10407검색

Is the setState operation an async operation in react?   solution

예, React의 setState 작업은 비동기식입니다. 이는 setState를 호출할 때 React가 상태를 즉시 업데이트하지 않음을 의미합니다. 대신 업데이트를 예약하고 나중에 처리하며 일반적으로 렌더링 성능을 최적화하기 위해 일괄적으로 처리합니다.

setState가 비동기식인 이유는 무엇인가요?

성과를 위한 1배칭:
React는 이벤트 핸들러 또는 수명 주기 메서드에서 여러 setState 호출을 일괄 처리합니다. React는 전체 업데이트 배치가 처리된 후 한 번만 다시 렌더링하므로 불필요한 다시 렌더링이 줄어들고 성능이 향상됩니다.

2개 상태 업데이트 지연:
업데이트는 비동기식이므로 setState를 호출한 후 즉시 상태에 액세스하려고 하면 업데이트된 상태가 제공되지 않을 수 있습니다. 업데이트 전 상태를 받게 됩니다.

비동기 동작의 예

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
    console.log(this.state.count);  // Logs the old state, not the updated one
  };

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}

이 예에서 증분 함수가 호출되면 setState는 상태 업데이트를 예약하지만 즉시 적용하지는 않습니다. 따라서 console.log(this.state.count)는 업데이트된 상태가 아닌 이전 상태를 기록합니다.

해결책: setState와 함께 콜백 사용

상태가 업데이트되고 구성 요소가 다시 렌더링된 후 작업을 수행해야 하는 경우 React가 제공하는 콜백 함수를 setState의 두 번째 인수로 사용할 수 있습니다.

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 }, () => {
      console.log(this.state.count);  // Logs the updated state
    });
  };

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}


이 솔루션에서 setState는 상태를 업데이트한 다음 콜백을 호출하여 다시 렌더링이 발생한 후 업데이트된 상태에 대한 액세스를 제공합니다.

해결책: 기능 업데이트 사용

또 다른 접근 방식은 setState의 기능적 형식을 사용하는 것입니다. 이를 통해 React는 이전 상태를 기반으로 새 상태를 계산할 수 있습니다. 이 접근 방식은 상태 업데이트가 이전 상태에 따라 달라질 때 권장됩니다. 업데이트가 가장 최근 상태를 기반으로 하도록 보장하기 때문입니다.

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  increment = () => {
    this.setState((prevState) => ({
      count: prevState.count + 1
    }));
  };

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}

이 접근 방식을 사용하면 항상 최신 상태로 작업할 수 있으며, 이는 여러 setState 호출이 있고 가장 최근 상태 값에 의존해야 할 때 특히 유용합니다.

기억해야 할 핵심 사항

  • setState는 비동기식이며 상태를 즉시 업데이트하지 않습니다.

  • setState를 호출한 직후 this.state에 의존하면 안 됩니다. 업데이트가 아직 처리되지 않았을 수 있기 때문입니다.

  • setState에서 제공하는 콜백 함수나 기능 업데이트를 사용하여 업데이트된 상태에 따른 로직을 처리하세요.

요약:

setState는 비동기식이지만 콜백이나 기능 업데이트를 사용하여 상태 업데이트 타이밍을 효과적으로 관리할 수 있으므로 상태가 업데이트된 후 수행해야 하는 모든 작업이 올바르게 수행되도록 할 수 있습니다.

위 내용은 setState 작업이 반응하는 비동기 작업인가요? 해결책의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.