Warning: setState(...): Can only update a mounted or mounting component. This usually means you call

一,出現以上異常的緣由分析:ajax

  由於在組件掛載(mounted)以後進行了異步操做,好比ajax請求或者設置了定時器等,而你在callback中進行了setState操做。當你切換路由時,組件已經被卸載(unmounted)了,此時異步操做中callback還在執行,所以setState沒有獲得值。異步

二,解決方案:this

(1)在卸載的時候對全部的操做進行清除:

componentDidMount = () => { //1.ajax請求 $.ajax('你的請求',{}) .then(res => { this.setState({ aa:true }) }) .catch(err => {}) //2.定時器 timer = setTimeout(() => { //dosomething },1000) } componentWillUnMount = () => { //1.ajax請求 $.ajax.abort() //2.定時器 clearTimeout(timer) }
(2)、設置一個flag,當unmount的時候重置這個flag
componentDidMount = () => {
    this._isMounted = true;
    $.ajax('你的請求',{})
        .then(res => {
            if(this._isMounted){
                this.setState({
                    aa:true
                })
            }
        })
        .catch(err => {})
}
componentWillUnMount = () => {
    this._isMounted = false;
}

(3)、組件卸載的時候直接return
componentDidMount = () => {
    $.ajax('你的請求',{})
    .then(res => {
        this.setState({
            data: datas,
        });
    })
    .catch(error => {

     });
}
componentWillUnmount = () => {
    this.setState = (state,callback)=>{
      return;
    };
}
相關文章
相關標籤/搜索