我试图使用链接将状态发送到另一个组件,但它总是给我这个错误
警告:无法对已卸载的组件执行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>
)
}
}
导出默认主页
componentWillUnmount = () => {
this.createRoomHandler()
}
首先,您无缘无故地创建了一个arrow函数,它们通常用于没有正确的this
引用的回调。您还使用了。在构造函数中绑定
,因为您已经在其他地方使用了箭头函数(请改用它们)。
您正在调用setState
,因为组件正在卸载,这没有意义。如果您想在某个组件因某种原因卸载时发出请求,那么请调用一个方法,该方法不尝试在不再存在的组件上设置状态(setState是异步的,因此在该组件被移除后完成,因此会导致mem泄漏),例如调用redux存储。
您需要取消计时器,例如setTimeout
,setInterval
,取消XHR请求(理想),或者如果组件已卸载,则在完成时不调用setState。另外,不要在请求回调中捕获来自组件的引用,否则也会泄漏内存。