React onClick - pass event with parameter

JavascriptReactjsEventsDom Events

Javascript Problem Overview


Without Parameter

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

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

With Parameter

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

I want to get the event. How can I get it?

Javascript Solutions


Solution 1 - Javascript

Try this:

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

And in your function:

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

Solution 2 - Javascript

With the ES6, you can do in a shorter way like this:

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

And use it:

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

Solution 3 - Javascript

Solution 1

function clickMe(parameter, event){
}

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

Solution 2 Using the bind function is considered better, than the arrow function way, in solution 1. Note, that the event parameter should be the last parameter in the handler function

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

Solution 4 - Javascript

Currying with ES6 example:

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

Our button, that toggles handler:

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

If you want to call this function expression without an event object, then you'd call it this way:

clickHandler(1)();

Also, since react uses synthetic events (a wrapper for native events), there's an event pooling thing, which means, if you want to use your event object asynchronously, then you'd have to use 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.
};

Here's live example: https://codesandbox.io/s/compassionate-joliot-4eblc?fontsize=14&hidenavigation=1&theme=dark

Solution 5 - Javascript

To solve the creating new callback issue completely, utilize the data-* attributes in HTML5 is the best solution IMO. Since in the end of the day, even if you extract a sub-component to pass the parameters, it still creates new functions.

For example,

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

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

See https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes for using data-* attributes.

Solution 6 - Javascript

<Button onClick={(e)=>(console.log(e)}>Click Me</Button>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIMOBAMAView Question on Stackoverflow
Solution 1 - JavascriptJyothi Babu ArajaView Answer on Stackoverflow
Solution 2 - JavascriptMinh KhaView Answer on Stackoverflow
Solution 3 - JavascriptBence DergezView Answer on Stackoverflow
Solution 4 - JavascriptAlexander KimView Answer on Stackoverflow
Solution 5 - JavascriptHarry ChangView Answer on Stackoverflow
Solution 6 - JavascriptAkash ChhetriView Answer on Stackoverflow