reactjs - 如何在 React 中手动删除事件监听器

标签 reactjs react-hooks event-listener removeeventlistener

我正在使用 react 钩子(Hook),我想有条件地添加和删除监听器(不仅仅是在我的组件卸载的情况下)。 我的组件添加了监听器,但从未删除它。为什么会这样?

useEffect(() => {
    if (isPlaying) {
      document.addEventListener('keydown', handleKeyPress);
    }

    if (!isPlaying) {
      document.removeEventListener('keydown', handleKeyPress);
    }

    return () => {
      document.removeEventListener('keydown', handleKeyPress);
    };
  }, []);

最佳答案

问题是我忘记重新订阅 isPlaying 属性。如果没有任何参数,useEffect 仅运行一次,然后在销毁时清除。 在上面的代码中,useEffect 的调用与 componentDidMount 中的调用相同,并且碰巧 isPlaying 属性等于 true,因此添加了 eventListener。但是,当 isPlaying 变为 false 时,useEffect 永远不会再次调用,并且显然永远不会删除事件监听器。 修复方法是将 isPlaying 作为第二个参数传递给 useEffect:

... return () => {
      document.removeEventListener('keydown', handleKeyPress);
    };
  }, [isPlaying]);

关于reactjs - 如何在 React 中手动删除事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59183623/

相关文章:

javascript - Firefox element.event 有效,但 element.addEventlistener 无效

javascript - TinyMCE 自托管 React

javascript - React Router 在客户端打印 react empty

reactjs - redux reducer 不更新状态

javascript - 创建时访问对象内容

reactjs - useEffect 模拟 componentWillUnmount 不返回更新状态

css - 如何在剪贴板中复制颜色,reactjs

javascript - 如何将参数传递给 react 中的事件监听器

python - 如何在 Sublime Text 2 中检测 set_user_setting 事件

javascript - 当方法绑定(bind)到事件监听器时, "this"未定义