React onClick - parametresiyle olay geçirin


93

Parametresiz

function clickMe(e){
  //e is the event
}

<button onClick={this.clickMe}></button>

Parametreli

function clickMe(parameter){
  //how to get the "e" ?
}
<button onClick={() => this.clickMe(someparameter)}></button>

Ben almak istiyorum event. Onu nasıl alabilirim?

Yanıtlar:


170

Bunu dene:

<button onClick={(e) => {
     this.clickMe(e, someParameter)
}}>Click Me!</button>

Ve görevinizde:

function clickMe(event, someParameter){
     //do with event
}

2
Bu bana bir eslint hatası vermişti ( eslint.org/docs/rules/arrow-parens.html ) Yaptığım şey, işlev parametrelerini parantez içine onClick={(e) => { this.clickMe(e, someparameter) }}
almaktı

1
Evet @kretzm Eğer parantez vermezsek, tek satır olduğunda bir dönüş ifadesi olarak davranır, aksi takdirde işlev gövdesi olarak sarmak için parantez kullanmalıyız.
Jyothi Babu Araja

4
Bunun tavsiye edilmeyen bir sözdizimi olduğunu eklemek istiyorum. Reactjs docs'dan: Bu sözdizimiyle ilgili sorun, düğme her görüntülendiğinde farklı bir geri çağrının oluşturulmasıdır. Çoğu durumda, bu iyidir. Ancak, bu geri arama daha düşük bileşenlere bir destek olarak iletilirse, bu bileşenler fazladan bir yeniden oluşturma yapabilir. Bu tür performans sorunlarından kaçınmak için genellikle yapıcıda bağlamayı veya sınıf alanları sözdizimini kullanmanızı öneririz. Daha fazla bilgi reactjs.org adresinde
Northernwind

1
@Victor. Evet haklısın. Ancak, geri aramada ebeveyninizin bağlamını istiyorsanız, her işlemede farklı geri aramaya sahip olmanız gerekir. Aslında bu bir değiş tokuş bence.
Jyothi Babu Araja

@JyothiBabuAraja Bence en iyi çözüm data-*HTML5'teki öznitelikleri kullanmaktır . Daha fazla ayrıntı için lütfen aşağıdaki cevabıma bakın.
Harry Chang

34

ES6 ile bunun gibi daha kısa bir şekilde yapabilirsiniz:

const clickMe = (parameter) => (event) => {
    // Do something
}

Ve onu kullanın:

<button onClick={clickMe(someParameter)} />

bu aynı zamanda yeni bir geri arama sorununu da çözüyor mu? stackoverflow.com/questions/42597602/…
Otani Shuzo

1
buna ek olarak birden fazla parametre gönderebilirsiniz. const clickMe = (parametre1, parametre2) => (olay) => {// Bir şeyler yapın}
AhuraMazda

1
Bu, bileşeniniz monte edildiğinde de ateşlenir, kodunuz şöyle olmalıdır:onClick={(e) => clickMe(someParameter)(e)}
Alexander Kim

Sadece clickMe'ye benzer şekilde, bir parametre olarak tanımlamasanız bile olayı yok edebilirsiniz.
Minh Kha

Bunun için teşekkürler. İşe yarıyor. Ama const clickMe = (parameter) => (event) => {...} bunun yerine neden var const clickMe = (parameter) => {...}?
zrna

16

1.Çözüm

function clickMe(parameter, event){
}

<button onClick={(event) => {this.clickMe(someparameter, event)}></button>

Çözüm 2 Çözüm 1'de bağlama işlevini kullanmak ok işlevi yolundan daha iyi kabul edilir. Unutmayın, olay parametresi işleyici işlevindeki son parametre olmalıdır.

function clickMe(parameter, event){
}

<button onClick={this.clickMe.bind(this, someParameter)}></button>

Çözüm 2'deki son şey olay parametresi için +1. Neyi yanlış yaptığımı anlamam sonsuza dek sürdü, belgelerde bir yerde sebebini gözden kaçırmış olmalıyım.
abelito

5

Yeni geri arama sorununu tamamen çözmek için, data-* , HTML5'teki öznitelikleri en iyi çözüm IMO'dur. Günün sonunda, parametreleri geçirmek için bir alt bileşen çıkarsanız bile, yine de yeni fonksiyonlar yaratır.

Örneğin,

const handleBtnClick = e => {
  const { id } = JSON.parse(e.target.dataset.onclickparam);
  // ...
};

<button onClick={handleBtnClick} data-onclickparam={JSON.stringify({ id: 0 })}>

Öznitelikleri kullanmak için https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes adresine bakın data-*.


Bu yaklaşımı beğendim. Basit ve temiz
marknt15

5

ES6 ile curing örneği:

const clickHandler = param => event => {
  console.log(param); // your parameter
  console.log(event.type); // event type, e.g.: click, etc.
};

İşleyiciyi değiştiren düğmemiz:

<button onClick={(e) => clickHandler(1)(e)}>Click me!</button>

Bu işlev ifadesini bir olay nesnesi olmadan çağırmak istiyorsanız, şu şekilde çağırırsınız:

clickHandler(1)();

Ayrıca, react sentetik olaylar (yerel olaylar için bir sarmalayıcı) kullandığından, bir olay havuzlaması vardır , yani eventnesnenizi eşzamansız olarak kullanmak istiyorsanız, şunu kullanmanız gerekir event.persist():

const clickHandler = param => event => {
  event.persist();
  console.log(event.target);
  setTimeout(() => console.log(event.target), 1000); // won't be null, otherwise if you haven't used event.persist() it would be null.
};

Canlı örnek: https://codesandbox.io/s/compassionate-joliot-4eblc?fontsize=14&hidenavigation=1&theme=dark


Neden hala olması gerekiyor event.persist()ile console.log(event)ama birlikte buna ihtiyacı yoktur console.log(event.target)?
Isaac Pak


Bu bağlamda, 2 parametre alan normal bir işlevi kullanmak, körlemeden daha hızlıdır. jsben.ch'de bir karşılaştırma testi çalıştırabilirsiniz
ncesar

@ncesar React'i jsben.ch'de nasıl kurarsınız? Testinizi lütfen gönderin.
Isaac Pak

@IsaacPak jsben, javascript kodlarını test etmek için basit bir araçtır. Hemen hemen iki farklı kod örneği yerleştirir ve hızlarını karşılaştırırsınız. Tüm React kodunuzu koymak zorunda değilsiniz, sadece daha yavaş olabileceğini düşündüğünüz ve test etmek istediğiniz bir işlev. Ayrıca, emin olmak için her zaman jsben.ch ve jsbench.me kullanıyorum. ClickHandler bağlamında, bazı kodlarla alay etmeniz gerekir. Gibi let event;bir tanımsız hata atmak olmaz bu yüzden.
ncesar
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.