index.js:1 Warning: Can't perform a React state update on an unmounted component. This is a no-op, b

在React开发中,咱们可能常常会遇到这个一个警告:react

 

 咱们不能在组件销毁后设置state,防止出现内存泄漏的状况:ajax

 

关于react中切换路由时报以上错误,实际的缘由是由于在组件挂载(mounted)以后进行了异步操做,好比ajax请求或者设置了定时器等,而你在callback中进行了setState操做。当你切换路由时,组件已经被卸载(unmounted)了,此时异步操做中callback还在执行,所以setState没有获得值。异步

解决的方式有两种:this

1、在卸载的时候对全部的操做进行清除(例如:abort你的ajax请求或者清除定时器)spa

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的时候重置这个flagcode

componentDidMount = () => {
    this._isMounted = true;
    $.ajax('你的请求',{})
        .then(res => {
            if(this._isMounted){
                this.setState({
                    aa:true
                })
            }
        })
        .catch(err => {})
}
componentWillUnMount = () => {
    this._isMounted = false;
}

3、最简单的方式(万金油)component

componentDidMount = () => {
    $.ajax('你的请求',{})
    .then(res => {
        this.setState({
            data: datas,
        });
    })
    .catch(error => {
 
     });
}
componentWillUnmount = () => {
    this.setState = (state,callback)=>{
      return;
    };
}

4、在组件已经卸载时return,不去设置state:使用react组件this里面的updater属性上的isMounted方法判断组件是否存在,若是不存在,就return,再也不去设置setState。blog

if (this.updater.isMounted(this)) {
     this.setState({
         dashBoardDate: otherDashBoardDate
    })   
} else {
    return
}
相关文章
相关标签/搜索