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.