我在React应用程序中遇到了一个与处理键盘事件有关的奇怪问题.具体地说,当快速按Shift键,然后按字母键时,onKeyUp事件处理程序会将e.key值记录为RESET.但是,如果我按住Shift键,然后按字母键,它会正确地记录小写字符.

下面是相关代码:

import "./styles.css";

function Input({ keyupHandler }) {
  return <input onKeyUp={keyupHandler} placeholder="Type here" />;
}

export default function App() {
  function keyupHandler(e) {
    console.log(e.key); // Logs lowercase for quick Shift+Key presses
  }
  return (
    <div className="App">
      <Input keyupHandler={keyupHandler} />
    </div>
  );
}

我还创建了一个CodeSandbox example来说明这种行为.当快速点击Shift键,然后点击字母键,导致e. key被记录为Ctrl时,该问题特别明显.如果在按字母键之前按住Shift键,则字符将以正确的字形记录.

我试图理解为什么这种时间差异会影响记录的按键情况,以及如何确保e. key正确反映按键的情况,即使是快速Shift+按键组合.

任何对这种行为的见解或在React中有效处理它的建议都将受到极大的欢迎.

推荐答案

onKeyUp事件发生时,key is released.在事件处理程序中看到一个分号的事实表明,在102键时,您不再按下Shift键.

您看到输入中出现大写字母的事实是一个单独的行为.这是基于被按下的键(或键的组合),这可以由onKeyDown处理程序确定.因此,即使感觉像是在按下下一个字符之前释放了Shift键,但Shift键的onkeyup事件并没有在字符的onkeydown事件之前触发,因此导致了大写字母.

为了确认这一点,您可以将事件处理程序更改为onKeyDown,并看到记录的大写字母始终与输入显示的内容相匹配,

Reactjs相关问答推荐

react-hook-form问题:为什么getValues不返回大多数当前值?

如何使用React防止并发注册并处理Firestore数据库中的插槽可用性

迁移到React Router Dom v6后,我是否错误地使用了Link组件?

ReferenceError:未在Redux组件中定义窗口

cypress 不能点击SPAN

我想删除NextJs中的X轴标签APEXCHARTS

关于同一位置的不同组件实例的react S规则被视为相同组件

有没有办法将MUI网格元素与Flex-Start对齐?

生成Reaction Vite应用程序的停靠容器时无法识别环境变量

为什么React UseEffect挂钩在页面重新加载时运行

强制 useEffect 仅运行一次

基于 React/NextJS Timer 的文本淡入/淡出不起作用

在按钮单击中将动态参数传递给 React Query

我正在通过 API(有效)从 MongoDB 传递数据.可视化但我不断收到此 TypeError: Cannot convert undefined or null to object

我可以更改 styled() 中的响应吗? (MUI v5)

将 ref 赋予功能组件以使用内部功能

React Router v6 - 访问嵌套路由和处理手写 url 的正确方法

在 Reactjs 中状态发生变化时渲染一个新组件而不替换旧组件

哪个 PrivateRouter 实现更好:高阶组件还是替换?

a.active 类在导入 x.scss 文件时有效,但在使用 x.module.scss 时无效