微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

处理多个状态更改的最佳方法

如何解决处理多个状态更改的最佳方法

我对反应还很陌生。我正在构建一个运行良好的网络应用程序,但我不确定我是否正确处理状态更改。例如,我有一个componentDidMount调用方法

继续调用 setState 似乎是一种低效和不好的做法,但我不确定是否有更好的方法来做到这一点。

我希望得到一些反馈。

class AuditScreen extends Component {
  constructor(props) {
    super(props);
    this.state = { 
      currentVehicle: null,currentVehicleIndex: 0,vehicles: [],activePictureIndex: 0,show: false,loading: false,next_page: `${props.backend.id}/images`,};
  }

  componentDidMount() {
    this.getimages()
  }


  getimages() {
    if (!this.state.loading) {
      this.setState({
        loading: true,});
      this.registerScrollEvent();
      axios.get(this.state.next_page)
        .then((response) => {
          const paginator = response.data;
          const vehicles = paginator.data.filter((vehicle) => {
            if (vehicle.enhanced && vehicle.enhanced.length) {
              return vehicle;
            }
          });
          if (vehicles && vehicles.length) {
            this.setState({
              vehicles: [...this.state.vehicles,...vehicles],next_page: paginator.next_page_url,});

            if (this.state.currentVehicle === null) {
              this.setState({
                currentVehicle: vehicles[0]
              });
            }
          }

          // remove scroll event if next_page_url is null
          if (!paginator.next_page_url) {
            this.removeScrollEvent();
          }
        })
        .finally((response) => {
          this.setState({
            loading: false,});
        });
    }
  }
}

.....

}

谢谢!

解决方法

如果不想停止在react中调用setState方法,可以使用context for small project或者redux来保持states和reducers与功能组件。最好的问候。

,

就像@Dave Newton 所说的,我不认为这是不好的做法。更新状态不会立即触发更新。相反,状态更新经常(但不总是)批量更新,然后触发单个更新。

This article 详细解释了批处理机制。在 React 17 之前,状态更新批处理只发生在事件处理程序和 componentDidMount 中。他们给出了一个明确的例子,其中“setStatecomponentDidMount 中被调用,这只会导致一个额外的更新(而不是三个)”。

所以 React 已经做了你想要的。 React 18 将让您更好地控制批处理行为,以及更加自动化的批处理。我发现 this description 有助于了解即将发生的事情以及 React 17 及更低版本当前的工作方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。