ReactJS'deki `onKeyPress` olayı nasıl işlenir?


215

Nasıl yapabilir onKeyPressReactJS olay çalışmaları? enter (keyCode=13)Basıldığında uyarı vermelidir .

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
Yana v0.11 Tepki okunabilir dizeleri içine anahtar kodlarını normalleştirir. Ben keyCodes yerine bunları kullanmanızı öneririz.
Randy Morris

@RandyMorris reaksiyonu anahtar kodları her zaman doğru şekilde normalleştirmez. "+" Üretmek için shiftKey = true ile 187 anahtar kodu değerini verirsiniz, ancak "anahtar" değeri "Tanımlanamayan" olarak çözülür.
Herr

Yanıtlar:


226

React 0.14.7 ile çalışıyorum, kullanıyorum onKeyPressve event.keyiyi çalışıyor.

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
ve bunu testlerde simüle edebilirsiniz:Simulate.keyPress(ReactDOM.findDOMNode(component.refs.input),{key:"Enter"});
sylvain

2
Deneysel olarak ne demek istiyorsun? ES6 ile düşündüm "functionName (param) => {}" işe yarar?
Waltari

4
@Waltari Bu ES6 ok işlevi , yanifunction handleKeyPress(event){...}
Haven

2
Aynı zamanda bağlanırthis
bhathiya-perera

4
Belki de bilgiçlik taslaktır, ancak katı eşitlik ===kontrolünü kullanmanın tercih edileceğini belirtmek gerekir event.key == 'Enter'.
Alexander Nied

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

onKeyDownkeyCodeolayları algılar .


11
Genellikle onKeyUp aracılığıyla enter tuşu algılanan bir şey - bu, kullanıcının karar verirse etkileşimi durdurmasına izin verir. keyPress veya keyDown kullanarak hemen yürütülür.
Andreas

52

Benim onKeyPressiçin e.keyCodeher zaman 0, ama e.charCodedoğru değere sahip. Kullanılırsa onKeyDowndoğru kodu girin 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>
      );
    }
  });

Tepki Klavye Olayları .


9
.. yani ok tuşlarını ve / veya alfasayısal olmayan diğer tuşları kullanmakla ilgileniyorsanız, keyChar değil keyCode döndürmeyecekleri için onKeyDown tam size göre.
oskare

3
React keyEvents kendilerini denemek isteyenler için, burada oluşturduğum bir codeandbox .
AlienKevin


10

React size düşündüğünüz türden olayları geçirmiyor. Aksine, sentetik olaylardan geçiyor .

Kısa bir testte, event.keyCode == 0her zaman doğrudur. Ne istiyorsunevent.charCode


Bu soruyu etkilemiyor. Enter tuşuna basıldığında 13 numaralı keyCode değerini değiştirmez.
Tequilaman

1
ben sadece sentetik fonksiyonlar geri almaya devame.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

Bir fonksiyona dinamik bir parametre iletmek istiyorsanız, dinamik bir girişin içinde ::

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

Umarım bu birine yardımcı olur. :)


7

Partiye geç, ama bunu TypeScript'te yapmaya çalışıyordum ve bununla geldim:

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

Bu, ekrana basılan tam tuşu yazdırır. Div odaktayken tüm "a" tuşlarına yanıt vermek istiyorsanız, e.key ile "a" yı karşılaştırırsınız - kelimenin tam anlamıyla (e.key === "a").


Bu işe yaramıyor gibi görünüyor. stackoverflow.com/questions/43503964/…
sdfsdf

5

Keypress olayı konusunda bazı zorluklar var. Jan Wolter'in önemli olaylarla ilgili makalesi biraz eski ama önemli olay tespitinin neden zor olabileceğini açıklıyor.

Unutulmaması gereken birkaç nokta:

  1. keyCode, which, charCodeKeyUp ve keydown gelen bir tuşa basarak bir anlam / farklı bir değere sahiptir. Tümü kullanımdan kaldırılmıştır, ancak büyük tarayıcılarda desteklenmektedir.
  2. İşletim sistemi, fiziksel klavyeler, tarayıcılar (sürümler) anahtar kodu / değerleri üzerinde etkili olabilir.
  3. keyve codeson standartlardır. Ancak, yazma sırasında tarayıcılar tarafından iyi desteklenmezler.

Reaksiyon uygulamalarındaki klavye olaylarıyla başa çıkmak için tepki-klavye-olay işleyicisi uyguladım . Lütfen bir göz at.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.