reactjs 为什么要删除事件侦听器?

b4lqfgs4  于 2022-12-18  发布在  React
关注(0)|答案(3)|浏览(151)

我看到很多这样的代码:

componentDidMount() {
  // add event listener
}

componentWillUnmount() {
  // remove event listener
}

如果侦听器设置在像window这样的全局对象上,我可以理解,但是如果它只是设置在将要卸载的组件中的HTML元素上,侦听器不会随组件一起消失吗?

5jvtdoz2

5jvtdoz21#

由于以下原因,需要删除事件侦听器。

  • 避免内存泄漏,如果浏览器处理不当。现代浏览器将垃圾收集删除DOM元素的事件处理程序,但在像IE这样的遗留浏览器中,这将导致内存泄漏。
  • 避免组件的事件冲突。

下面是一个很好的article,可以深入了解事件列表程序

uqcuzwp8

uqcuzwp82#

现代浏览器在卸载组件时确实会删除组件上的事件侦听器,但由于某种原因,如果您将此节点的引用存储在任何其他未装载的组件或localStorage中,垃圾收集器将无法处理此操作,并可能导致内存泄漏。
因此,处理此类情况最安全的方法是手动删除componentWillUnmount中的事件侦听器。
P.S.对于钩子,react提供了返回函数的方法,该函数可用于删除useEffect钩子中的侦听器。

wfauudbj

wfauudbj3#

如果不删除事件侦听器,将导致旧浏览器的内存泄漏(IE 6和7,如果我没记错的话)。因此会导致不必要的高内存利用率,这会导致很多问题。另外,在这种情况下,您将遇到调试问题,因为在大型项目中,您永远无法控制整个代码库,并且可以从不同组件加载同一组件的多个引用,如果浏览器不处理内存泄漏,那么它将在触发事件方面造成许多混乱。

相关问题