我看到很多这样的代码:
componentDidMount() {
// add event listener
}
componentWillUnmount() {
// remove event listener
}
我了解侦听器是否设置在诸如window
之类的全局对象上,但是如果它只是在组件中要卸载的HTML元素上,那么侦听器是否仍会随组件一起消失? >
答案 0 :(得分:8)
由于以下原因,需要删除事件监听器。
这是一个很好的article,可让您深入了解事件列表器
答案 1 :(得分:6)
现代浏览器在卸载组件时确实会删除它们上的事件侦听器,但是由于某些原因,如果将此节点的引用存储在未安装的任何其他组件或localStorage中,则Garbage Collector将无法对其进行处理,并且可能会导致内存泄漏。
因此,处理此类情况的最安全方法是手动删除componentWillUnmount
中的事件侦听器。
P.S。使用挂钩,react提供了一种返回函数的方法,该函数可用于删除useEffect
挂钩中的侦听器。
答案 2 :(得分:1)
如果未删除事件侦听器,则会导致较旧的浏览器(IE 6和7,如果我没有记错的话)会导致内存泄漏。因此将导致不必要的高内存利用率,这将导致许多问题。同样,在这种情况下,您将遇到调试问题,因为在大型项目中您永远无法控制整个代码库,并且可以从不同组件加载同一个组件的多个引用,并且如果浏览器未处理内存泄漏,那么它将对触发事件造成很多混乱。