Tanpa Parameter
function clickMe(e){
//e is the event
}
<button onClick={this.clickMe}></button>
Dengan Parameter
function clickMe(parameter){
//how to get the "e" ?
}
<button onClick={() => this.clickMe(someparameter)}></button>
Saya ingin mendapatkan event
. Bagaimana saya mendapatkannya?
javascript
reactjs
events
dom-events
IMOBAMA
sumber
sumber
onClick={(e) => { this.clickMe(e, someparameter) }}
data-*
atribut di HTML5. Silakan lihat jawaban saya di bawah ini untuk lebih jelasnya.Dengan ES6, Anda dapat melakukannya dengan cara yang lebih singkat seperti ini:
const clickMe = (parameter) => (event) => { // Do something }
Dan gunakan itu:
sumber
onClick={(e) => clickMe(someParameter)(e)}
const clickMe = (parameter) => (event) => {...}
malah adaconst clickMe = (parameter) => {...}
?Solusi 1
function clickMe(parameter, event){ } <button onClick={(event) => {this.clickMe(someparameter, event)}></button>
Solusi 2 Menggunakan fungsi mengikat dianggap lebih baik, daripada cara fungsi panah, dalam solusi 1. Perhatikan, bahwa parameter peristiwa harus menjadi parameter terakhir dalam fungsi handler
function clickMe(parameter, event){ } <button onClick={this.clickMe.bind(this, someParameter)}></button>
sumber
Untuk mengatasi masalah pembuatan panggilan balik baru sepenuhnya, memanfaatkan
data-*
atribut dalam HTML5 adalah solusi terbaik IMO. Karena pada akhirnya, meskipun Anda mengekstrak sub-komponen untuk meneruskan parameter, itu masih membuat fungsi baru.Sebagai contoh,
const handleBtnClick = e => { const { id } = JSON.parse(e.target.dataset.onclickparam); // ... }; <button onClick={handleBtnClick} data-onclickparam={JSON.stringify({ id: 0 })}>
Lihat https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes untuk menggunakan
data-*
atribut.sumber
Currying dengan ES6 contoh:
const clickHandler = param => event => { console.log(param); // your parameter console.log(event.type); // event type, e.g.: click, etc. };
Tombol kami, yang mengalihkan penangan:
<button onClick={(e) => clickHandler(1)(e)}>Click me!</button>
Jika Anda ingin memanggil ekspresi fungsi ini tanpa objek event, maka Anda akan memanggilnya seperti ini:
clickHandler(1)();
Selain itu, karena react menggunakan kejadian sintetis (pembungkus untuk kejadian asli), ada hal penggabungan kejadian , yang berarti, jika Anda ingin menggunakan
event
objek secara asinkron, Anda harus menggunakanevent.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. };
Berikut contoh langsungnya: https://codesandbox.io/s/compassionate-joliot-4eblc?fontsize=14&hidenavigation=1&theme=dark
sumber
event.persist()
denganconsole.log(event)
tetapi saya tidak membutuhkannyaconsole.log(event.target)
?let event;
itu tidak akan menimbulkan kesalahan yang tidak ditentukan.