提问者:小点点

警告:无法对未安装的组件执行React状态更新


我试图使用链接将状态发送到另一个组件,但它总是给我这个错误

警告:无法对已卸载的组件执行React状态更新。

我想知道避免这种冲突的最佳解决方案是什么。

提前谢谢你

class Home extends Component {
constructor() {
    super()
    this.state = {
        data: {},
        name: ""
    }
    this.createRoomHandler = this.createRoomHandler.bind(this)
}
 createRoomHandler() {

    var settings = {
        "async": true,
        "crossDomain": true,
        "url": "https://api.eyeson.team/rooms",
        "method": "POST",
        "headers": {
            "Authorization": ""

        },
        "data": {
            "user[name]": this.state.name
        }
    }



    $.ajax(settings).done((response) => {

        this.setState({ data: response });
        console.log("ashraf", response)
    })


}
  createNamehandler = (e) => {
    this.setState({ name: e.target.value })

}
  componentWillUnmount = () => {
    this.createRoomHandler()
}
render() {

    return (
        <div className="create-room-container">
            <input onChange={this.createNamehandler} />
            <Link to={{ pathname: "CreateStream", query: 
            this.state.data }} > <button onClick= 
            {this.createRoomHandler}>Create 
  Room</button></Link>
        </div>
    )
  }

}

导出默认主页


共1个答案

匿名用户

componentWillUnmount = () => {
  this.createRoomHandler()
}

首先,您无缘无故地创建了一个arrow函数,它们通常用于没有正确的this引用的回调。您还使用了。在构造函数中绑定,因为您已经在其他地方使用了箭头函数(请改用它们)。

您正在调用setState,因为组件正在卸载,这没有意义。如果您想在某个组件因某种原因卸载时发出请求,那么请调用一个方法,该方法不尝试在不再存在的组件上设置状态(setState是异步的,因此在该组件被移除后完成,因此会导致mem泄漏),例如调用redux存储。

您需要取消计时器,例如setTimeoutsetInterval,取消XHR请求(理想),或者如果组件已卸载,则在完成时不调用setState。另外,不要在请求回调中捕获来自组件的引用,否则也会泄漏内存。