When handling an onChange event, this one works:
<input type="file" onChange={this.onChange}
Not this one, that executes instantaneously the function:
<input type="file" onChange={this.onChange()}
Not this other one, doesn't execute:
<input type="file" onChange={() => this.onChange}
But this one does:
<input type="file" onChange={() => this.onChange()}
But, while the first one automatically sends the event object, the second one needs to explicitly send it:
<input type="file" onChange={(e) => this.onChange(e)}
onChange(e) {
    console.log(e.target.files[0])
}
Why is that? and when should we use one or the another?
With onChange={(e) => this.onChange(e)}, you are essentially creating a new function that calls this.onChange method during each render.
With onChange={this.onChange}, you are directly accessing this.onChange method. This method is only defined once and is used multiple times. Basically, you are avoiding creating a new function with a new render thus giving the application a slight performance enhancement
<input type="file" onChange={this.onChange}
This works because onChange prop is a function, then you are passing a function reference to it, so it works. And <input> is responsible for passing event parameter to it.
<input type="file" onChange={this.onChange()}
This doesn't work because you are assigning to onChange prop the result value of the onChange function. (But depending of your function, it could work)
<input type="file" onChange={() => this.onChange}
This also doesn't work because you are creating a new function, and inside it, you are using the reference to a function this.onChange you are not executing it  (with parentheses).
<input type="file" onChange={() => this.onChange()}
This executes the function (you are calling this.onChange()) inside your anonymous function, but you are not passing parameters to it, so how do you expect to get event info inside this.onChange function?
<input type="file" onChange={(e) => this.onChange(e)}
onChange(e) {
    console.log(e.target.files[0])
}
This resolve my previous point, now in your anonymous function you are getting event info e, and you are passing it to your onChange function. Then it works.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With