为什么我不能在react组件中删除事件监听器?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我不能在react组件中删除事件监听器?相关的知识,希望对你有一定的参考价值。

虽然我知道,这个问题已被多次询问,但通常的答案是“你传递的是副本,而不是原件”。除非我理解错误,否则这不是我的问题。

我使用以下代码在React中创建了一个Modal:

const Modal: React.StatelessComponent<Props> = 
({ isOpen, closeModal, closeOnClick = true, style, children }: Props) => {

  const closeOnEsc: (e: KeyboardEvent) => void = (e: KeyboardEvent) => {
    e.stopImmediatePropagation();
    if (e.keyCode === 27) {
      closeModal();
    }
  };

  if (isOpen) {
    document.body.classList.add('freezeScroll');
    window.addEventListener('keyup', closeOnEsc, { once: true });
    return (
      <div className={styles.modal} onClick={closeOnClick ? closeModal : undefined} >
        <div className={`${styles.modalContent} ${closeOnClick ? styles.clickable : undefined} ${style}`} >
          {children}
        </div>
      </div>
    );
  }
  document.body.classList.remove('freezeScroll');
  window.removeEventListener('keyup', closeOnEsc, { once: true });
  return null;
};

我只添加了{once:true}选项,因为我不能删除它。一旦模态关闭,就会调用window.removeEventListener,但它不会删除事件监听器。 任何人都可以帮我找出原因吗?

答案

我不会亲自手动绑定SFC中的侦听器。如果你真的想要,我会让回调删除监听器。

在你的closeOnEsc回调中,添加window.removeEventListener('keyup', closeOnEsc);

这个问题,如果在没有调用回调的情况下卸载组件,那么你的内存泄漏很少。

我将使用类组件,并确保在componentWillUnmount生命周期钩子中也删除了侦听器。

以上是关于为什么我不能在react组件中删除事件监听器?的主要内容,如果未能解决你的问题,请参考以下文章

在 React 功能组件中使用 ref 添加测试鼠标事件监听器

React Navigation didfocus 事件监听器在类组件和功能组件之间的工作方式不同

React Material:带有鼠标监听器的进度条

未在 React 中呈现的元素上的触发事件侦听器

本地存储中的更改未触发事件侦听器

反应组件中的 onDeviceReady 事件监听器