Come gestire l'evento `onKeyPress` in ReactJS?


215

Come posso far funzionare l' onKeyPressevento in ReactJS? Dovrebbe avvisare quando enter (keyCode=13)viene premuto.

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
Dal momento che v0.11 React normalizza i codici chiave in stringhe leggibili. Suggerirei di usare quelli al posto dei keyCodes.
Randy Morris,

La reazione di @RandyMorris non sempre normalizza correttamente i codici chiave. Per produrre "+" ti darà il valore del codice chiave di 187 con shiftKey = true, tuttavia il valore "chiave" si risolverà in "Non identificato".
Herr

Risposte:


226

Sto lavorando con React 0.14.7, uso onKeyPresse event.keyfunziona bene.

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
e puoi simularlo nei test con:Simulate.keyPress(ReactDOM.findDOMNode(component.refs.input),{key:"Enter"});
sylvain

2
Cosa intendi con sperimentale? Ho pensato che con ES6 "functionName (param) => {}" avrebbe funzionato?
Waltari,

4
@Waltari È la funzione della freccia ES6 , il che significafunction handleKeyPress(event){...}
Haven

2
this
Vincola

4
Forse è pedante, ma vale la pena notare che sarebbe preferibile utilizzare il rigoroso ===controllo dell'uguaglianza event.key == 'Enter'.
Alexander Nied,

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

onKeyDownrileva keyCodeeventi.


11
Di solito una cosa come il tasto invio viene rilevato tramite onKeyUp - questo consente all'utente di interrompere l'interazione se decide di farlo. usando keyPress o keyDown si esegue immediatamente.
Andreas,

53

Per me onKeyPressl' e.keyCodeè sempre 0, ma e.charCodeha valore corretto. Se utilizzato onKeyDownil codice corretto in 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 .


9
..anche se sei interessato ad usare i tasti freccia e / o altri tasti non alfanumerici, onKeyDown fa per te in quanto non restituiranno un keyChar ma un keyCode.
Oskare,

3
Per coloro che sono interessati a provare React keyEvents stessi, ecco un codice e una casella che ho creato.
AlienKevin,


10

React non ti sta trasmettendo il tipo di eventi che potresti pensare. Piuttosto, sta passando eventi sintetici .

In un breve test, event.keyCode == 0è sempre vero. Quello che vuoi èevent.charCode


Questo non influisce sulla domanda però. Non cambia keyCode uguale a 13 quando si preme Invio.
Tequilaman,

1
continuo a riavere funzioni sintetiche pere.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

Se si desidera passare un parametro dinamico a una funzione, all'interno di un input dinamico:

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

Spero che questo aiuti qualcuno. :)


7

In ritardo alla festa, ma stavo cercando di farlo in TypeScript e ho pensato a questo:

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

Questo stampa il tasto esatto premuto sullo schermo. Quindi, se vuoi rispondere a tutte le pressioni "a" quando il div è attivo, devi confrontare e.key con "a" - letteralmente if (e.key === "a").


Questo non sembra funzionare. stackoverflow.com/questions/43503964/…
sdfsdf

5

Ci sono alcune sfide quando si tratta dell'evento keypress. L'articolo di Jan Wolter sugli eventi chiave è un po 'vecchio ma spiega bene perché il rilevamento degli eventi chiave può essere difficile.

Alcune cose da notare:

  1. keyCode, which, charCodeHanno valore diverso / significato in pressione del tasto da keyup e keydown. Sono tutti deprecati, tuttavia supportati nei principali browser.
  2. Sistema operativo, tastiere fisiche, browser (versioni) potrebbero avere un impatto sul codice / sui valori chiave.
  3. keye codesono lo standard recente. Tuttavia, non sono ben supportati dai browser al momento della scrittura.

Per affrontare gli eventi da tastiera nelle app di reazione, ho implementato il gestore di eventi di reazione da tastiera . Per favore guarda.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.