You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用react-hotkeys-hook时同时按热键1/2后释放未触发预期累加

问题解决:同时按下并释放热键时仅触发一个计数器累加

问题描述

应用中设置了热键1和2,分别用于累加计数器cnt1和cnt2。依次按下并释放两个热键时功能正常,但同时按下两者再同时释放时,仅其中一个计数器(如cnt2)会累加,另一个无反应。

原代码示例

import { useHotkeys } from 'react-hotkeys-hook';

export default function App() {
  const [cnt1, set1] = React.useState(0);
  const [cnt2, set2] = React.useState(0);

  useHotkeys('1', () => set1((v) => v + 1), { keyup: true });
  useHotkeys('2', () => set2((v) => v + 1), { keyup: true });

  return (
    <div>
      <div>{cnt1}</div>
      <div>{cnt2}</div>
    </div>
  );
}

问题原因

react-hotkeys-hook库在处理多个按键同时释放的keyup事件时,内部的事件匹配逻辑可能导致只有最后一个按键的回调被触发,无法同时响应多个热键的释放操作。

解决方案

改用原生的keyup事件监听,直接绑定到window对象上,确保每个按键的释放事件都能被独立捕获并处理:

import React from 'react';

export default function App() {
  const [cnt1, set1] = React.useState(0);
  const [cnt2, set2] = React.useState(0);

  React.useEffect(() => {
    const handleKeyUp = (event) => {
      switch (event.key) {
        case '1':
          set1(prev => prev + 1);
          break;
        case '2':
          set2(prev => prev + 1);
          break;
        default:
          break;
      }
    };

    window.addEventListener('keyup', handleKeyUp);
    return () => window.removeEventListener('keyup', handleKeyUp);
  }, []);

  return (
    <div>
      <div>{cnt1}</div>
      <div>{cnt2}</div>
    </div>
  );
}

这种方式绕过了库的事件处理逻辑,直接与浏览器原生事件交互,无论按键是否同时释放,每个keyup事件都会被单独处理,确保两个计数器都能正确累加。

内容的提问来源于stack exchange,提问作者Artur Carvalho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:32:17