如何处理 ReactJS 中的 `onKeyPress` 事件?

Posted

技术标签:

【中文标题】如何处理 ReactJS 中的 `onKeyPress` 事件?【英文标题】:How to handle the `onKeyPress` event in ReactJS? 【发布时间】:2015-03-05 19:21:41 【问题描述】:

如何使onKeyPress 事件在 ReactJS 中工作?当按下 enter (keyCode=13) 时它应该会发出警报。

var Test = React.createClass(
    add: function(event)
        if(event.keyCode == 13)
            alert('Adding....');
        
    ,
    render: function()
        return(
            <div>
                <input type="text" id="one" onKeyPress=this.add />    
            </div>
        );
    
);

React.render(<Test />, document.body);

【问题讨论】:

自从v0.11 React 将关键代码标准化为可读字符串。我建议使用这些而不是 keyCodes。 @RandyMorris react 并不总是正确地规范化键码。生成“+”将为您提供 187 的键代码值,其中 shiftKey = true 但是“键”值将解析为“未识别”。 【参考方案1】:

React 中的键盘事件 到目前为止,凭借您对 React 事件的一般知识,您现在可以在 React 中实现键盘事件。如前所述,可以使用两个键盘事件,keyup 和 keydown 事件。

import React from 'react';

function Quiz()
    handleAnswerChange(event)
        if(event.key === 'y')
            alert('The sky is your starting point!')
    
        else if (event.key === 'n') 
            alert('The sky is your limit?')
    


    return (
        <div>
                <p> Are You Smart?</p>
                    <input type="text" value=answer onKeyPress=handleAnswerChange/>
                <small> Press Y for Yes or N for No</small>
    </div>
)

【讨论】:

【参考方案2】:

这对我有用,通过访问窗口元素使用钩子

useEffect(() => 
    window.addEventListener('keypress', e => 
      console.log(e.key)
    );
  , []);

【讨论】:

【参考方案3】:

你需要在你的 keyPress 事件上调用 event.persist(); 这个方法。 示例:

const MyComponent = (props) => 
   const keyboardEvents = (event) =>
       event.persist();
       console.log(event.key); // this will return string of key name like 'Enter'
   
   return(
         <div onKeyPress=keyboardEvents></div>
   )

如果您现在在 keyboardEvents 函数中键入 console.log(event),您将获得其他属性,例如:

keyCode // number
charCode // number
shiftKey // boolean
ctrlKey // boolean
altKey // boolean

还有许多其他属性

感谢和问候

PS:React 版本:16.13.1

【讨论】:

【参考方案4】:

对我来说 onKeyPress e.keyCode 始终是 0,但 e.charCode 具有正确的值。如果使用onKeyDown,则e.charCode中的正确代码。

var Title = React.createClass(
    handleTest: function(e) 
      if (e.charCode == 13) 
        alert('Enter... (KeyPress, use charCode)');
      
      if (e.keyCode == 13) 
        alert('Enter... (KeyDown, use keyCode)');
      
    ,
    render: function() 
      return(
        <div>
          <textarea onKeyPress=this.handleTest />
        </div>
      );
    
  );

React Keyboard Events.

【讨论】:

..因此,如果您对使用箭头键和/或其他非字母数字键感兴趣,onKeyDown 适合您,因为它们不会返回 keyChar 而是 keyCode。 对于那些有兴趣自己尝试 React keyEvents 的人,这是我创建的 codesandbox。【参考方案5】:

Keypress 事件已弃用,您应该改用 Keydown 事件。

https://developer.mozilla.org/en-US/docs/Web/API/Document/keypress_event

handleKeyDown(event) 
    if(event.keyCode === 13)  
        console.log('Enter key pressed')
  


render()  
    return <input type="text" onKeyDown=this.handleKeyDown /> 

【讨论】:

它还支持event.key === 'Enter'。看看here。【参考方案6】:

我正在使用 React 0.14.7,使用 onKeyPressevent.key 效果很好。

handleKeyPress = (event) => 
  if(event.key === 'Enter')
    console.log('enter press here! ')
  

render: function()
     return(
         <div>
           <input type="text" id="one" onKeyPress=this.handleKeyPress />
        </div>
     );

【讨论】:

你可以在测试中模拟它:Simulate.keyPress(ReactDOM.findDOMNode(component.refs.input),key:"Enter"); 实验性是什么意思?我认为使用 ES6 "functionName(param) => " 会起作用吗? @Waltari 是 ES6 arrow function,意思是function handleKeyPress(event)... 它还绑定this 也许它是迂腐的,但值得注意的是,最好使用严格相等 === 检查 event.key == 'Enter'【参考方案7】:
var Test = React.createClass(
     add: function(event)
         if(event.key === 'Enter')
            alert('Adding....');
         
     ,
     render: function()
        return(
           <div>
            <input type="text" id="one" onKeyPress=(event) => this.add(event)/>    
          </div>
        );
     
);

【讨论】:

【参考方案8】:

在按键事件方面存在一些挑战。 Jan Wolter's article on key events 有点老了,但很好地解释了为什么关键事件检测很难。

需要注意的几点:

    keyCodewhichcharCode 在 keypress 与 keyup 和 keydown 中具有不同的值/含义。它们均已弃用,但在主流浏览器中均受支持。 操作系统、物理键盘、浏览器(版本)都可能对键码/值产生影响。 keycode 是最新的标准。但是,在撰写本文时,浏览器还没有很好地支持它们。

为了处理 React 应用程序中的键盘事件,我实现了react-keyboard-event-handler。请看一下。

【讨论】:

【参考方案9】:

如果你想将动态参数传递给函数,在动态输入中::

<Input 
  onKeyPress=(event) => 
    if (event.key === "Enter") 
      this.doSearch(data.searchParam)
    
  
  placeholder=data.placeholderText />
/>

希望这对某人有所帮助。 :)

【讨论】:

它对我有用【参考方案10】:

聚会迟到了,但我试图在 TypeScript 中完成这项工作并想出了这个:

<div onKeyPress=(e: KeyboardEvent<htmlDivElement>) => console.log(e.key)

这会将按下的确切键打印到屏幕上。因此,如果您想在 div 处于焦点时响应所有“a”按下,您可以将 e.key 与“a”进行比较——字面意思是 if(e.key === "a")。

【讨论】:

这似乎不起作用。 ***.com/questions/43503964/…【参考方案11】:

React 不会传递您可能认为的那种事件。相反,它正在传递synthetic events。

在简短的测试中,event.keyCode == 0 始终为真。你要的是event.charCode

【讨论】:

这并不影响问题。按下 Enter 时不会更改 keyCode 等于 13。 我只是不断为e.key || e.keyCode || e.charCode获取合成函数【参考方案12】:
render: function()
     return(
         <div>
           <input type="text" id="one" onKeyDown=this.add />
        </div>
     );

onKeyDown 检测到keyCode 事件。

【讨论】:

通常是通过 onKeyUp 检测到回车键 - 这允许用户在他决定停止交互时停止交互。使用 keyPress 或 keyDown 立即执行。

以上是关于如何处理 ReactJS 中的 `onKeyPress` 事件?的主要内容,如果未能解决你的问题,请参考以下文章

reactjs中如何处理this.setState问题

为啥 ReactJS 中一个组件的 css 文件与另一个组件的 css 文件交互?如何处理?

如何处理 React js 并发?

如何处理 Relay Modern 上的突变错误?

如何处理c#中的错误代码

如何处理片段和活动中的后压