在设置状态下无法在已卸载的组件上调用setState(或forceUpdate)

时间:2018-07-24 12:35:44

标签: react-native setstate

如何在componentDidMount()中使用setState或如何更改状态值? 使用以下代码时出现错误

  

无法在未安装的组件上调用setState(或forceUpdate)

componentDidMount(){
  this.interval = setInterval(() => {
    if(this.state.rmSec==0){
      this.setState({
        rmSec:59,
        rmMin:this.state.rmMin-this.state.minus,
      })
    }else{
      this.setState({
        rmSec:this.state.rmSec-this.state.minus
      })
    }

    if(this.state.rmMin==0){
      this.setState({
        rmSec:0,
        rmMin:0,
      })

    }


  }, 1000);
}

2 个答案:

答案 0 :(得分:0)

在调用setState()之前检查isMounted确实消除了警告,但也违反了警告的目的,因为现在您将永远不会收到警告(即使您应该这样做!)。 isMounted()避免在组件卸载后调用setState(),因为在组件卸载后调用setState()会发出警告。更多内容:https://reactjs.org/blog/2015/12/16/ismounted-antipattern.html。因此,尝试

 constructor(props) {
       this.state = {isMounted: false}
    }
 componentDidMount() {
       this.setState( { isMounted: true }, () => {

    });
}
componentWillUnmount() {
       this.setState( { isMounted: false } )
}

警告:在纯Javascript类中不推荐使用isMounted(...)。相反,请确保清理componentWillUnmount中的订阅和未决请求以防止内存泄漏。看起来像RN问题,我猜它将很快得到解决

答案 1 :(得分:0)

问题通过清除卸载时间间隔来解决

componentWillUnmount () {
    this.interval && clearInterval(this.interval);
    this.interval = false;
}