关于Warning: setState(...): Can only update a mounted or mounting component. 警告的解决方案

本文详细解释了在React应用中,当切换路由时出现特定警告的原因,并提供了三种有效的解决方案,帮助开发者避免因组件卸载后仍尝试更新状态而导致的问题。

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.

关于react中切换路由时报以上警告,实际的原因是因为在组件挂载(mounted)之后进行了异步操作。

比如ajax请求或者设置了定时器等,而你在回调函数中进行了setState操作。

当你切换路由时,组件已经被卸载(unmounted)了,此时异步操作中回调函数还在执行,因此setState没有得到值。

解决的方式:

一、在卸载的时候对所有的操作进行清除(例如:abort你的ajax请求或者清除定时器)

二、设置一个flag,当unmount的时候重置这个flag,设置一个state:fetching

但是由于this.setState是异步的,这种方式不一定会起作用

but:可以设置一个同步参数  

 _fetching = false
    componentDidMount() {
        this._fetching = true
        //在异步请求中有使用setState修改参数的地方
        if (this._fetching) {
            this.setState({
                ...
            })
        }
    }
    componentWillUnmount(){
        this._fetching = false  
        /清除该清除的定时器
    }

三、卸载异步操作设置状态

        this.setState = (state,callback)=>{

            return;

          }

方法三重写setState方法,让浏览器不能发现组件卸载后还通过setState来修改状态,但实际上还是在组件卸载后修改了state

只是不再报警告,不代表问题已经解决

方法一和方法二思想相同,但不是所有项目的请求都是通过ajax的,所以更推荐方法二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值