代码之家  ›  专栏  ›  技术社区  ›  Mirror318

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

  •  9
  • Mirror318  · 技术社区  · 7 年前

    componentDidMount() {
      // add event listener
    }
    
    componentWillUnmount() {
      // remove event listener
    }
    

    我能理解听众是不是在做一些全球性的事情 window ,但是如果它只是在即将卸载的组件中的一个HTML元素上,那么侦听器不会随组件一起消失吗?

    3 回复  |  直到 7 年前
        1
  •  21
  •   SAMUEL    7 年前

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

    • 避免内存泄漏,如果浏览器没有正确处理它。现代浏览器将垃圾收集事件处理程序删除的DOM元素,但这是不正确的情况下,传统的浏览器,如IE,这将造成内存泄漏。
    • 避免组件事件的冲突。

    这是一个好主意 article 了解事件列表器

        2
  •  10
  •   Shubham Khatri    7 年前

    现代浏览器在卸载组件时确实会删除组件上的事件侦听器,但是由于某种原因,如果您将此节点的引用存储在任何其他未装载的组件或本地存储中,垃圾收集器将无法处理此事件,并且可能导致内存泄漏。

    因此,处理此类场景最安全的方法是手动删除 componentWillUnmount .

    useEffect 钩子。

        3
  •  1
  •   Arnab    7 年前

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