React keydown 事件侦听器被多次调用?

约翰克斯

所以我做了这个模态https://codesandbox.io/s/amazing-morning-ukxp2?file=/src/components/Modal.js

每当您按下 esc 键时,就应该关闭模态。每次按 esc 时,我都添加了一条消息以显示。

但是,如果您检查控制台,它每次都会以 2x 的倍数打印我的消息,因此过一会儿它会显示 100 次这样的消息

这是我指的功能

           function keyPress(e) {
        if (e.key === 'Escape' && showModal) {
          setShowModal(false);
          console.log('I pressed');
        }
      }

      document.addEventListener('keydown', keyPress);

我尝试将其放入 useEffect 函数并将 showModal 添加为依赖项,但无法正常工作

当我只希望在模态打开时和按一次 esc 键时触发 keydown 事件侦听器时,如何防止 keydown 事件侦听器在控制台中显示这么多次?

似乎每次我重新打开模态时,它都会将 esc 键消息加倍。

尼古拉斯·赫维亚

您需要处理useEffect钩子内的事件侦听器(添加、删除)

useEffect(() => {
  document.addEventListener("keydown", keyPress);
  return () => document.removeEventListener("keydown", keyPress);
});

这样,您将keyPress在每个生命周期中订阅函数。为了进一步改进它,您可以包装keyPress在 useCallback 钩子中(以记住新渲染中的函数)并将其添加为依赖项:

  const keyPress = useCallback(
    (e) => {
      if (e.key === "Escape" && showModal) {
        setShowModal(false);
        console.log("I pressed");
      }
    },
    [setShowModal, showModal]
  );

  useEffect(() => {
    document.addEventListener("keydown", keyPress);
    return () => document.removeEventListener("keydown", keyPress);
  }, [keyPress]);

修改代码和框

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

React JS keyDown 侦听器故障

如何在div上使用“ keydown”事件侦听器?

React - 从 keydown 事件调用时,函数不知道状态

OnChild事件侦听器被多次调用

在 contenteditable 父 div 中的 div 上附加 keydown 事件侦听器不起作用?

Keydown 事件與 React 中的 onClick 事件不同

如何向 React 组件添加事件侦听器?

React:与事件侦听器相关的批处理状态更新

react组件中的onDeviceReady事件侦听器

基于 Redux 状态更改的 React 事件侦听器

对 React 事件侦听器内存泄漏的担忧

使用jQuery侦听keydown事件

无法将KeyDown事件调度到React组件

一旦 React 卸载事件侦听器,就不会再次添加事件侦听器的问题

不能多次调用FileReader事件侦听器

通过addEventListener添加的事件侦听器被多次调用

事件侦听器多次调用Javascript函数

在keydown事件之后检查keydown值以防止keydown

如何设置事件侦听器并使用react钩子在首次触发事件后将其删除?

流类型“ keydown”事件

VueJs keydown 事件堆积

Keydown事件未触发

在实现google oauth 2.0隐式登录React时,多次触发isSignedIn的侦听器

在我的React自定义钩子的每次调用中添加和删除事件侦听器是否太昂贵?如何避免呢?

jQuery事件侦听器多次触发

如何将参数从组件传递到 React 中的事件侦听器?

React HOC-将事件侦听器添加到包装的组件中

React.js:useEffect 与窗口调整大小事件侦听器不起作用

如何使用react devtools将功能绑定到onClick事件侦听器