在setState
内部的异步函数中调用componentWillUnmount
可能导致内存泄漏:https://medium.freecodecamp.org/how-to-work-with-react-the-right-way-to-avoid-some-common-pitfalls-fc9eb5e34d9e
public componentWillUnmount(): void {
this.subscription.unsubscribe().catch(this.onError);
}
鉴于上述情况,这还会产生内存泄漏吗?可以在unsubscribe
完成之前卸载组件,因此直到卸载后才调用组件的onError
方法。组件是否会被垃圾回收?
答案 0 :(得分:0)
本文并没有说setState
会导致发生内存泄漏。
无法在已卸载的组件上调用setState(或forceUpdate)。这是无人操作,但它指示您的应用程序中的内存泄漏。
问题不仅限于setState
或forceUpdate
。它们只是React可以在需要时跟踪并发出警告的方法。他们的电话表明,组件实例在卸载后正在发生某些事情。
在卸载之后引用this
组件实例意味着在完成涉及this
的操作之前,不能对组件实例进行垃圾回收。如果操作立即完成,则不会发生内存泄漏。万一花了几分钟,那就有泄漏了。
只要this.subscription.unsubscribe()
不会导致长期运行的承诺或待处理的承诺,而这将导致在短时间内不调用this.onError
,并且onError
不包含麻烦的代码,它不应引起内存泄漏。这是属于componentWillUnmount
的代码的示例。
从钩子方法返回一个承诺也可能是有益的,因此可以在测试中对其进行监视和链接。