Why Do I Need To Wrap SetState Callback In An Anonymous Arrow Function For It To Run After State Change?
Solution 1:
What is confusing you is the order of evaluation in JavaScript, it's nothing React-specific.
If you have
foo(this.doSearch())
doSearch will be called immediately. That is, even before foo is called, and then the result of doSearch will be passed to foo.
You don't want that, you want to pass the computation to the setState function. That is, you want to pass the function doSearch, not the result of the function.
So what you actually want is
changePage = (e) => {
this.setState({
searchPage: e,
isLoading: true
}, this.doSearch);
}
Which means you're passing the function this.doSearch to setState. Of course, this.doSearch is equivalent to () => this.doSearch() (both are functions that, when called, call this.doSearch()).
Solution 2:
One calls it immediately and passes its return value as the callback to be used (bad). The other creates a function and that is used as the callback (good).
Its like accidentally writing an event listener like this:
// Assign console.log as the callbak
// Will print the event argument on click
// (just mentioning for completeness)
addEventlistener("click", console.log)
// vs
// Immediately print "a"
// Add undefined as callback
// (your first example [bad])
addEventlistener("click", console.log("a")):
// vs
// Add function that will print "a" after a click
// (your second example [good])
addEventlistener("click", () => console.log("a"))
Post a Comment for "Why Do I Need To Wrap SetState Callback In An Anonymous Arrow Function For It To Run After State Change?"