组件已挂载,但我不能调用this.setState(...)或this.forceUpdate(...);



我正在使用可滚动的选项卡视图和Facebook官方通量解决方案。在某些情况下,场景保持非活动状态(不是当前选择的选项卡)并从商店收到需要更新场景的事件,但我有此错误: Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op.

我已经仔细检查了,componentWillUnmount()没有被调用..但是我收到此警告,并且无法再更新组件的状态。

在这里,我有一些组件的示例代码,该组件在未选择的选项卡中存在此问题:

 constructor(props) {
    super(props);
    this.state = {
      isFavorite: this.isCurrentPostFavorite,
      isMounted: false,
      value: 0,
    };
    this.updateStateForFavoriteModification = this.updateStateForFavoriteModification.bind(this);
  }
  componentDidMount() {
    this.setState({isMounted: true});
    console.log('Article Scene did mount for article: '.toUpperCase() + this.props.sceneInfo.article.name);
    HotelStore.bind(HotelEvent.didModifiedFavorite, this.updateStateForFavoriteModification.bind(this));
  }
  componentWillUnmount() {
    this.setState({isMounted: false});
    console.log('Article Scene will unmount for article: '.toUpperCase() + this.props.sceneInfo.article.name);
    HotelStore.unbind(HotelEvent.didModifiedFavorite, this.updateStateForFavoriteModification);
  }
  changeFavoriteStatus() {
    if (this.state.isFavorite) {
      sendAction(HotelAction.removeFavorite, this.props.sceneInfo.article);
    }
    else {
      sendAction(HotelAction.addFavorite, this.props.sceneInfo.article);
    }
  }
  updateStateForFavoriteModification() {
    console.log('Update: '.toUpperCase() + this.props.sceneInfo.article.name);
    console.log('isMounted: '.toUpperCase() + this.state.isMounted);
    //
    //
    // Here I Get the error
    this.setState({isFavorite: this.isCurrentPostFavorite});
  }
  get isCurrentPostFavorite() {
    let matchNumber = HotelStore.favoritesPosts.filter((el: Post) => {
      return el.translationId === this.props.sceneInfo.article.translationId;
    }).length;
    let isFavorite = matchNumber > 0;
    console.log(isFavorite);
    return isFavorite;
  }

结果组件确实挂载了日志console.log('Article Scene will unmount for article: '.toUpperCase() + this.props.sceneInfo.article.name);在更新状态之前永远不会显示,在this.setState(...)之前,布尔isMounted始终true在日志中。

编辑:我知道isMounted,这是一个反父,我只用它来检查日志中是否挂载了组件,如果我删除isMounted逻辑,错误仍然存在。

首先,你不应该想要检查你的组件是否被安装,这是一个反模式。

我猜出现警告是因为您在组件将卸载中使用 setState。我认为这样做的问题是setState是异步的,因此当您调用函数时,状态可能不会立即更改。在这种情况下,它可能会尝试在组件已卸载时更改状态。

相关内容

  • 没有找到相关文章

最新更新