我正在使用可滚动的选项卡视图和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是异步的,因此当您调用函数时,状态可能不会立即更改。在这种情况下,它可能会尝试在组件已卸载时更改状态。