प्रतिक्रिया पर क्लिक करें - पैरामीटर के साथ ईवेंट पास करें


99

पैरामीटर के बिना

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

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

पैरामीटर के साथ

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

मैं पाना चाहता हूं event। मैं इसे कैसे प्राप्त कर सकता हूँ?

जवाबों:


178

इसे इस्तेमाल करे:

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

और अपने समारोह में:

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

3
इसने मुझे एक अनुलग्‍नक त्रुटि ( eslint.org/docs/rules/arrow-parens.html ) दी थी, मैंने क्या किया था, कोष्ठक में फ़ंक्शन मापदंडों को लपेटा थाonClick={(e) => { this.clickMe(e, someparameter) }}
kretzm

1
हां @kretzm यदि हम ब्रेसिज़ नहीं देते हैं, तो यह एक वापसी अभिव्यक्ति के रूप में कार्य करता है जब यह एकल पंक्ति है तो हमें फ़ंक्शन बॉडी के रूप में रैप करने के लिए ब्रेसिज़ का उपयोग करना चाहिए।
ज्योति बाबू आराजा

4
मैं सिर्फ यह जोड़ना चाहता हूं कि यह अनुशंसित सिंटैक्स नहीं है। Reajjs डॉक्स से: इस सिंटैक्स के साथ समस्या यह है कि हर बार बटन रेंडर करते समय एक अलग कॉलबैक बनाया जाता है। ज्यादातर मामलों में, यह ठीक है। हालांकि, यदि यह कॉलबैक निचले घटकों के लिए एक प्रस्ताव के रूप में पारित किया जाता है, तो वे घटक अतिरिक्त पुन: प्रतिपादन कर सकते हैं। हम आमतौर पर इस प्रकार की प्रदर्शन समस्या से बचने के लिए, कंस्ट्रक्टर में बाइंडिंग या क्लास फ़ील्ड सिंटैक्स का उपयोग करने की सलाह देते हैं। पर अधिक जानकारी reactjs.org
northernwind

1
@Victor। हाँ आप सही है। लेकिन अगर आप अपने कॉलबैक के अंदर अपने माता-पिता का संदर्भ चाहते हैं, तो आपको प्रत्येक रेंडर पर अलग कॉलबैक की आवश्यकता होगी। वास्तव में यह मेरे विचार से एक व्यापार है।
ज्योति बाबू आराजा

@JyothiBabuAraja मुझे लगता है कि data-*HTML5 में विशेषताओं का उपयोग करने के लिए सबसे अच्छा समाधान है । कृपया अधिक जानकारी के लिए नीचे मेरा जवाब देखें।
हैरी चांग

38

ES6 के साथ, आप इस तरह से छोटे तरीके से कर सकते हैं:

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

और इसका उपयोग करें:

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

यह भी एक नया कॉलबैक समस्या को हल करता है? stackoverflow.com/questions/42597602/…
ओटानी शुजो

1
इसके अतिरिक्त, आप कई पैरामीटर भेज सकते हैं। const clickMe = (पैरामीटर 1, पैरामीटर 2) => (घटना) => {// कुछ करें}
अहुरामाज़ादा

1
आपके घटक के माउंट होने पर यह भी निकाल दिया जाता है, आपका कोड होना चाहिए:onClick={(e) => clickMe(someParameter)(e)}
अलेक्जेंडर किम

इसी तरह अगर सिर्फ क्लिक करें, तो आप ईवेंट को नष्ट भी कर सकते हैं, यहां तक ​​कि यू इसे एक पैरामीटर के रूप में परिभाषित नहीं करते हैं।
मिन्ह खां

इसके लिए धन्यवाद। यह काम करता हैं। लेकिन const clickMe = (parameter) => (event) => {...} इसके बजाय क्यों है const clickMe = (parameter) => {...}?
zrna

17

समाधान 1

function clickMe(parameter, event){
}

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

समाधान 2 बाइंड फ़ंक्शन का उपयोग करना बेहतर माना जाता है, एरो फ़ंक्शन तरीका, समाधान 1 में। ध्यान दें, कि ईवेंट पैरामीटर हैंडलर फ़ंक्शन में अंतिम पैरामीटर होना चाहिए

function clickMe(parameter, event){
}

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

इवेंट पैरामीटर के लिए +1 समाधान # 2 में अंतिम चीज है। मुझे यह महसूस करने के लिए हमेशा के लिए ले लिया कि मैं क्या गलत कर रहा था, मुझे डॉक्स में कहीं न कहीं कारण याद आ गया होगा।
अबेलिटो

5

नई कॉलबैक समस्या को पूरी तरह से हल करने के लिए, data-*HTML5 में विशेषताओं का उपयोग करना सबसे अच्छा समाधान IMO है। चूंकि दिन के अंत में, भले ही आप मापदंडों को पारित करने के लिए एक उप-घटक निकालते हैं, फिर भी यह नए कार्यों का निर्माण करता है।

उदाहरण के लिए,

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

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

विशेषताओं का उपयोग करने के लिए https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes देखें data-*


मुझे यह तरीका पसंद है। सरल और साफ
marknt15

5

ES6 उदाहरण के साथ करी :

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

हमारे बटन, कि टॉगल हैंडलर:

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

यदि आप किसी इवेंट ऑब्जेक्ट के बिना इस फ़ंक्शन को कॉल करना चाहते हैं, तो आप इसे इस तरह से कॉल करेंगे:

clickHandler(1)();

इसके अलावा, चूंकि प्रतिक्रिया सिंथेटिक घटनाओं (देशी घटनाओं के लिए एक आवरण) का उपयोग करती है, इसलिए एक घटना पूलिंग चीज़ है, जिसका अर्थ है, यदि आप अपनी eventवस्तु को अतुल्यकालिक रूप से उपयोग करना चाहते हैं , तो आपको उपयोग करना होगा 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.
};

यहाँ लाइव उदाहरण है: https://codesandbox.io/s/compassionate-joliot-4eblc?fontsize=14&hidenavigation=1&theme=dark


क्यों मैं अभी भी करने की आवश्यकता है event.persist()के साथ console.log(event)है, लेकिन मैं के साथ इसकी आवश्यकता नहीं है console.log(event.target)?
इसहाक पाक


इस संदर्भ में, यह सामान्य है कि करीने की तुलना में 2 पारम प्राप्त करने वाले एक सामान्य फ़ंक्शन का उपयोग किया जाए। आप एक बेंचमार्क टेस्ट jsben.ch
ncesar

@ncesar आप jsben.ch में प्रतिक्रिया कैसे सेट करते हैं? अपने परीक्षण plz पोस्ट करें।
इसहाक पाक

@IsaacPak jsben जावास्क्रिप्ट कोड का परीक्षण करने के लिए एक सरल उपकरण है। आप कोड के दो अलग-अलग नमूने लेते हैं और उनकी गति की तुलना करते हैं। आपको अपना संपूर्ण रिएक्ट कोड नहीं डालना है, बस एक ऐसा फ़ंक्शन जो आपको लगता है कि धीमा हो सकता है और आप परीक्षण करना चाहते हैं। इसके अलावा, मैं हमेशा सुनिश्चित करने के लिए jsben.ch और jsbench.me का उपयोग करता हूं। क्लिकहैंडलर संदर्भ में, आपको कुछ कोडों का मजाक बनाना होगा। जैसा let event;तो यह नहीं होते एक अपरिभाषित त्रुटि फेंक देते हैं।
निसार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.