Як поводитися з подією `onKeyPress` в ReactJS?


215

Як я можу змусити роботу 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);

15
Оскільки v0.11 React нормалізує ключові коди у читабельні рядки. Я б запропонував використовувати їх замість keyCodes.
Ренді Морріс

@RandyMorris реакція не завжди нормалізує ключові коди правильно. При виробництві "+" ви отримаєте значення ключового коду 187 з shiftKey = true, проте значення "ключ" вирішиться як "Невідоме".
Гер

Відповіді:


226

Я працюю з React 0.14.7, використовую onKeyPressі event.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>
     );
}

18
і ви можете імітувати його в тестах за допомогою:Simulate.keyPress(ReactDOM.findDOMNode(component.refs.input),{key:"Enter"});
sylvain

2
Що ви маєте на увазі під експериментальним? Я думав, що з ES6 "functionName (param) => {}" буде працювати?
Валтарі

4
@Waltari Це функція стрілки ES6 , це означаєfunction handleKeyPress(event){...}
Хейвен

2
Він також пов'язуєthis
bhathiya-pera

4
Можливо, це педантично, але варто зазначити, що краще було б використовувати строгий ===контроль рівності event.key == 'Enter'.
Олександр Нід

53
render: function(){
     return(
         <div>
           <input type="text" id="one" onKeyDown={this.add} />
        </div>
     );
}

onKeyDownвиявляє keyCodeподії.


11
Зазвичай річ, коли ключ введення виявляється через onKeyUp - це дозволяє користувачеві припинити взаємодію, якщо він вирішить. використання keyPress або keyDown виконується негайно.
Андреас

52

Для мене завжди , але має правильне значення. Якщо використовується правильний код у .onKeyPresse.keyCode0e.charCodeonKeyDowne.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>
      );
    }
  });

Реагуйте на події на клавіатурі .


9
.. тому якщо вам цікаво використовувати клавіші зі стрілками та / або інші не буквено-цифрові клавіші, onKeyDown для вас, оскільки вони не повернуть keyChar, а keyCode.
oskare

3
Для тих, хто зацікавлений у тому, щоб спробувати сам ключ React, ось створений я кодекс і скриньку .
AlienKevin


10

Реакція не передає тобі тих подій, які ти можеш думати. Швидше, це проходження синтетичних подій .

У короткому випробуванні event.keyCode == 0завжди правда. Те, що ти хочеш, так і єevent.charCode


Це, однак, не впливає на питання. При натисканні клавіші Enter не змінюється keyCode, рівний 13.
Текіламан

1
я просто продовжую отримувати синтетичні функції назадe.key || e.keyCode || e.charCode
chovy

10
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>
        );
     }
});

9

Якщо ви хотіли передати динамічний парам до функції, всередині динамічного вводу:

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

Сподіваюся, що це комусь допоможе. :)


7

Пізно до вечірки, але я намагався зробити це в TypeScript і придумав таке:

<div onKeyPress={(e: KeyboardEvent<HTMLDivElement>) => console.log(e.key)}

Це друкує точну клавішу, натиснуту на екран. Тож якщо ви хочете відповісти на всі натискання "a", коли дів знаходиться у фокусі, ви порівняєте e.key з "a" - буквально, якщо (e.key === "a").


Це, здається, не працює. stackoverflow.com/questions/43503964/…
sdfsdf

5

Є деякі проблеми, коли справа стосується події натискання клавіш. Стаття Яна Волтера про ключові події трохи стара, але добре пояснює, чому виявлення ключових подій може бути важким.

Кілька речей, які слід зазначити:

  1. keyCode, which, charCodeМають різне значення / значення в KeyUp від натискання клавіші і KeyDown. Усі вони застарілі, однак підтримуються в основних браузерах.
  2. Операційна система, фізичні клавіатури, браузери (версії) можуть впливати на код / ​​значення клавіш.
  3. keyі codeє останнім стандартом. Однак браузери під час написання їх недостатньо підтримують.

Для вирішення подій клавіатури в реагуючих додатках я реалізував обробник реакцій-клавіатури-події . Будь ласка, подивіться.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.