Need suggestion on having function within a functional component in react Hooks
.
As far as I researched, many are saying it is bad practice because it creates nested/inner function every time we call re-render. After doing some analysis,
I found we can use onClick={handleClick.bind(null, props)}
on the element and place the function outside the functional component.
Example:
const HelloWorld = () => {
function handleClick = (event) => {
console.log(event.target.value);
}
return() {
<>
<input type="text" onChange={handleClick}/>
</>
}
}
Please advise if there is any alternative way.
Thanks in advance.
You can use
useCallback
feature :For further details visit their reference link: React useCallback
The old way has two options too.
First solution: To pass the your
handleClick
function to your functional component.Second solution: To define your function outside of your functional component.
No, inner functions / closures are so common, there is no problem with them. The engine can heavily optimize those.
The point here is that you pass the function as a prop to the child component. And as the function was "recreated", it does not equal the previous function passed, annd thus the child does rerender (and that's whats bad for performance).
You can resolve that with
useCallback
, which memoizes the function reference.As per React Documentation (ending part),
Class field syntax:
arrow function in the callback syntax:
Don't worry about it
Don't worry about creating new functions on each render. Only in edge cases does that impede your performance. Setting
onClick
handlers are not one of those, so just create a new function on each render.However, when you need to make sure you use the same function every time, you can use useCallaback
Why not use
useCallback
foronClick
Here is a reason why you shouldn't bother with
useCallback
foronClick
handlers (and most other event handlers).Consider the following code snippets, one without useCallback:
and one with useCallback:
The only difference in the latter is that React doen's have to change the
onClick
on your button ifprops.foo
remains the same. Changing the callback is a very cheap operation, and it's not at all worth complicating your code for the theoretical performance improvement it gives.Also, it's worth noting that a new function is still created on every render even when you use
useCallback
, butuseCallback
will return the old one as long as the dependencies passed as the second argument are unchanged.Why ever use
useCallback
The point of using
useCallback
is that if you compare two functions with reference equality,fn === fn2
is true only iffn
andfn2
point to the same function in memory. It doesn't matter if the functions do the same.Thus, if you have memoisation or otherwise only run code when the function changes, it can be useful to use
useCallback
to use the same function again.As an example, React hooks compare old and new dependencies, probably using Object.is.
Another example is React.PureComponent, which will only re-render when props or state have changed. This can be useful for components that use a lot of resources to render. Passing e.g. a new
onClick
to a PureComponent on each render will cause it to re-render every time.