tuşuna bastıktan sonra onChange olayını çağırmak için


206

Ben Bootstrap için yeniyim ve bu sorun ile sıkışmış. Bir giriş alanım var ve sadece bir rakam girer girmez, işlev onChangeçağrılıyor, ancak tam sayı girildiğinde 'Enter' tuşuna bastığımda çağrılmasını istiyorum. Doğrulama işlevi için aynı sorun - çok erken çağırıyor.

var inputProcent = React.CreateElement(bootstrap.Input, {type: "text",
  //bsStyle: this.validationInputFactor(),
  placeholder: this.initialFactor,
  className: "input-block-level",
  onChange: this.handleInput,
  block: true,
  addonBefore: '%',
  ref:'input',
  hasFeedback: true
});

Yanıtlar:


409

Göre Doc Tepki , sen gibi klavye olayları dinleyebiliriz onKeyPressveya onKeyUpdeğil onChange.

var Input = React.createClass({
  render: function () {
    return <input type="text" onKeyDown={this._handleKeyDown} />;
  },
  _handleKeyDown: function(e) {
    if (e.key === 'Enter') {
      console.log('do validate');
    }
  }
});

Güncelleme: React.Component kullanın

İşte aynı şeyi yapan React.Component kullanan kod

class Input extends React.Component {
  _handleKeyDown = (e) => {
    if (e.key === 'Enter') {
      console.log('do validate');
    }
  }

  render() {
    return <input type="text" onKeyDown={this._handleKeyDown} />
  }
}

İşte jsfiddle .

Güncelleme 2: İşlevsel bir bileşen kullanın

const Input = () => {
  const handleKeyDown = (event) => {
    if (event.key === 'Enter') {
      console.log('do validate')
    }
  }

  return <input type="text" onKeyDown={handleKeyDown} />
}

2
Ayrıca, doğrulama işlemini onBlurolaya bağlamak istersiniz .
wuct

5
Giriş metnine referansla daha kompakt bir şekilde aynı çözüm:<input ref='reference' onKeyPress={(e) => {(e.key === 'Enter' ? doSomething(this.refs.reference.value) : null)}} />
musemind

5
@musemind Aslında, kullanmanıza gerek yok ref. <input onKeyPress={e => doSomething(e.target.value)}yeterlidir.
16:50

4
@musemind Satır içi işlev yerine sınıf yöntemi kullanmanın amacı, her onKeyPresstetiklendiğinde yeni bir işlev oluşturmaktan kaçınmaktır . İnce bir mükemmel gelişme.
1616'da

1
ekli keman artık çalışmıyor, lütfen kontrol edin, yine de güzel cevap
Pardeep Jain

53

OnKeyPress öğesini doğrudan giriş alanında kullanabilirsiniz. onChange işlevi her giriş alanı değişikliğindeki durum değerini değiştirir ve Enter tuşuna basıldıktan sonra bir işlev araması () çağırır.

<input
    type="text"
    placeholder="Search..."
    onChange={event => {this.setState({query: event.target.value})}}
    onKeyPress={event => {
                if (event.key === 'Enter') {
                  this.search()
                }
              }}
/>

bu cevap yukarıdaki kabul edilen cevaptan ziyade benim için çalışıyor.
karthik shankar

Eğer ağır formunuz varsa render yöntemi dışında fonksiyon oluşturmanızı ve referans olarak geçmenizi tavsiye ederim, onKeyPress={this.yourFunc}aksi takdirde her renderde yağ ok fonksiyonu yeniden oluşturulacaktır.
Viktor

bu, girdi ve üst vaka için onKeyPress olayının da yazıldığı durumda işe yarar. Teşekkürler.
Naveen Kumar PG

VeyaonKeyPress={event => event.key === 'Enter' && this.search()}
camden_kid

24

bir form denetimine (giriş) odaklanıldığında normalde formun kendisinde (girişte değil) bir (onSubmit) olayı tetiklediğinde Enter tuşuna basıldığında , formunuzu SubSubmit'e submitbağlayabilirsiniz this.handleInput.

Alternatif olarak , odağı kaldırıldığında gerçekleşen blur(onBlur) olayına bağlayabilirsiniz input(örneğin odaklanabilecek bir sonraki öğeye sekme)


3
Bu kullanmaktan çok daha temiz onKeyPress.
Blackus

1
Hedef farklı event.target.valueolduğu için
düşünülmüş

@Izkata söylediğin kesinlikle doğru; cevabım denetleyici handleInputyönteminde işleri ele almak için farklı bir yol gerektirebilir . Cevabım gereği yapılması, hem girişe odaklanırken kullanıcı enter tuşuna bastığında hem de bir submitdüğmeyi / girişi etkinleştirirken sizi kapsayacaktır .
Luca

Gelen en web durumlara Bu cevap kullanım-Vakaların çoğunda, IMHO alakalı değildir bu yüzden hiçbir formlar, sadece girişler vardır uygulamalar
vsync

@vsync çoğunluk ile ilgili olmayabilir, ama yine de bir kısmı için geçerli - ve kesinlikle yanlış değil, ben bir aşağı değer olduğunu sanmıyorum?
Luca

8

Kullanabilirsiniz event.key

function Input({onKeyPress}) {
  return (
    <div>
      <h2>Input</h2>
      <input type="text" onKeyPress={onKeyPress}/>
    </div>
  )
}

class Form extends React.Component {
  state = {value:""}

  handleKeyPress = (e) => {
    if (e.key === 'Enter') {
      this.setState({value:e.target.value})
    }
  }

  render() {
    return (
      <section>
        <Input onKeyPress={this.handleKeyPress}/>
        <br/>
        <output>{this.state.value}</output>
      </section>
    );
  }
}

ReactDOM.render(
  <Form />,
  document.getElementById("react")
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="react"></div>


5

Kullanıcılara tepki verin, işte tamlık için bir cevap.

Reaksiyon sürümü 16.4.2

Her tuş vuruşu için güncelleme yapmak veya değeri yalnızca gönderim sırasında almak istersiniz. Bileşen çalışmalarına önemli olayların eklenmesi, ancak resmi dokümanlarda önerilen alternatifler var.

Kontrollü ve Kontrolsüz bileşenler

Kontrollü

Gönderen Dokümanlar - Formlar ve Kontrollü bileşenler :

HTML'de input, textarea ve select gibi form öğeleri genellikle kendi durumlarını korur ve bunu kullanıcı girdisine göre günceller. React'te, değiştirilebilir durum genellikle bileşenlerin state özelliğinde tutulur ve yalnızca setState () ile güncellenir.

Tepki durumunu “tek hakikat kaynağı” haline getirerek bu ikisini birleştirebiliriz. Ardından, bir formu oluşturan React bileşeni, sonraki kullanıcı girdisinde bu formda neler olduğunu da denetler. Değeri React tarafından bu şekilde kontrol edilen bir girdi form öğesine “kontrollü bileşen” denir.

Kontrollü bir bileşen kullanıyorsanız, değerdeki her değişiklik için durumu güncel tutmanız gerekir. Bunun olması için, bileşene bir olay işleyicisi bağlarsınız. Dokümanların örneklerinde genellikle onChange olayı.

Misal:

1) Yapıcıdaki olay işleyiciyi bağlama (değer devlette tutulur)

constructor(props) {
    super(props);
    this.state = {value: ''};

    this.handleChange = this.handleChange.bind(this);
}

2) İşleyici işlevi oluşturma

handleChange(event) {
    this.setState({value: event.target.value});
}

3) Form gönderme işlevi oluşturma (değer durumdan alınır)

handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
}

4) Oluştur

<form onSubmit={this.handleSubmit}>
    <label>
      Name:
      <input type="text" value={this.state.value} onChange={this.handleChange} />
    </label>
    <input type="submit" value="Submit" />
</form>

Kontrollü bileşenler kullanırsanız handleChange, uygun durumu güncellemek ve korumak için işleviniz her zaman tetiklenir. Eyalet her zaman güncellenmiş değere sahip olacak ve form gönderildiğinde, değer eyaletten alınacaktır. Formunuz çok uzunsa bu bir con olabilir, çünkü her bileşen için bir işlev oluşturmanız veya her bileşenin değer değişikliğini işleyen basit bir işlev yazmanız gerekir.

kontrolsüz

Gönderen Dokümanlar - Kontrolsüz bileşeni

Çoğu durumda, formları uygulamak için kontrollü bileşenler kullanmanızı öneririz. Kontrollü bir bileşende, form verileri bir React bileşeni tarafından işlenir. Alternatif, form verilerinin DOM tarafından ele alındığı kontrolsüz bileşenlerdir.

Her durum güncelleştirmesi için bir olay işleyicisi yazmak yerine denetlenmeyen bir bileşen yazmak için DOM'dan form değerleri almak için bir ref kullanabilirsiniz.

Buradaki temel fark, onChangefonksiyonu kullanmak değil onSubmit, değerleri almak ve gerekliyse doğrulamak için formun kullanılmasıdır.

Misal:

1) Olay işleyiciyi bağlayın ve yapıcıya giriş yapmak için ref oluşturun (hiçbir değer durumda tutulmaz)

constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.input = React.createRef();
}

2) Form gönderme işlevi oluşturma (değer DOM bileşeninden alınır)

handleSubmit(event) {
    alert('A name was submitted: ' + this.input.current.value);
    event.preventDefault();
}

3) Oluştur

<form onSubmit={this.handleSubmit}>
    <label>
      Name:
      <input type="text" ref={this.input} />
    </label>
    <input type="submit" value="Submit" />
</form>

Kontrolsüz bileşenler kullanırsanız , bir handleChangeişlevi bağlamanız gerekmez . Form gönderildiğinde, değer DOM'den alınır ve gerekli doğrulamalar bu noktada gerçekleşebilir. Herhangi bir giriş bileşeni için herhangi bir işleyici işlevi oluşturmaya gerek yoktur.

Sorununuz

Şimdi, sorununuz için:

... 'Tüm numara girildiğinde Enter' tuşuna bastığımda çağrılmasını istiyorum

Bunu başarmak istiyorsanız kontrolsüz bir bileşen kullanın. Gerekli değilse onChange işleyicilerini oluşturmayın. enterAnahtar formu göndermek ve handleSubmitfonksiyon kovulacak.

Yapmanız gereken değişiklikler:

Öğenizdeki onChange çağrısını kaldırın

var inputProcent = React.CreateElement(bootstrap.Input, {type: "text",
    //    bsStyle: this.validationInputFactor(),
    placeholder: this.initialFactor,
    className: "input-block-level",
    // onChange: this.handleInput,
    block: true,
    addonBefore: '%',
    ref:'input',
    hasFeedback: true
});

Formu gönderin ve girişinizi doğrulayın. Değeri form gönderme işlevinde öğenizden almanız ve sonra doğrulamanız gerekir. Yapıcıda öğenize referans oluşturduğunuzdan emin olun.

  handleSubmit(event) {
      // Get value of input field
      let value = this.input.current.value;
      event.preventDefault();
      // Validate 'value' and submit using your own api or something
  }

Kontrolsüz bir bileşenin kullanımına örnek:

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    // bind submit function
    this.handleSubmit = this.handleSubmit.bind(this);
    // create reference to input field
    this.input = React.createRef();
  }

  handleSubmit(event) {
    // Get value of input field
    let value = this.input.current.value;
    console.log('value in input field: ' + value );
    event.preventDefault();
    // Validate 'value' and submit using your own api or something
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" ref={this.input} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

ReactDOM.render(
  <NameForm />,
  document.getElementById('root')
);

3

Bunun gibi küçük bir sarma işlevi de yazabilirsiniz

const onEnter = (event, callback) => event.key === 'Enter' && callback()

Daha sonra girişlerinizde tüketin

<input 
    type="text" 
    placeholder="Title of todo" 
    onChange={e => setName(e.target.value)}
    onKeyPress={e => onEnter(e, addItem)}/>
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.