This content originally appeared on DEV Community and was authored by The Nerdy Dev
Hey everyone 👋🏻,
In this article, let us learn about a very special React Hook called as the useMemo hook and understand how and when to use it.
This article was first published on https://the-nerdy-dev.com.
Check the website for more interesting articles and tutorials on Web Development.
What is the useMemo
hook ?
useMemo
is a React Hook that was introduced to memoize expensive computations. Let us understand some basics about this. In order to understand the useMemo
hook, let us understand its syntax:
const memoResult = useMemo(someFunction, dependencies);
So what happens with useMemo
is that when the component renders for the first time, the useMemo
hook invokes the someFunction
(it could be any function, I am just calling it as someFunction
) and memoizes the value that it computes for us and then it returns the result back to the component. Now the interesting thing here is that if during the subsequent renders, the list of dependencies that we specify do NOT change, then in that case useMemo
will not invoke the someFunction
but instead it will return the memoized value. Contrary to this, if the list of dependencies experience a change during subsequent renders, then useMemo
will invoke the someFunction
, memoize the result that it gets as a result of computation and then return it back to the component. So in essence, this is what happens in the useMemo
hook.
Now let us see a simple example :
Let us say we have a component that deals with computation of factorial of a number, let's call the component as FactorialResult
. Now what this component does is that it computes the factorial of a number that is supplied into the input field by the user. Let us see the basic code for same :
import React from 'react'
function computeFactorial(num) {
if(num == 0) {
return 1;
}
return num * computeFactorial(num - 1)
}
const FactorialResult = () => {
const [num, setNum] = React.useState(0);
const factorial = computeFactorial(num);
const handleChange = event => {
setNum(+event.target.value);
}
return (
<div>
Factorial of
<input type="number"
value={num}
onChange={handleChange} />
is {factorial}
</div>
);
}
Now every time, you change the input value, the factorial is re-calculated as a result of re-render.
Now how can we memoize this factorial calculation which itself is an expensive operation ? We want to memoize the factorial computation when the component re-renders. So for this we can make use of the useMemo
hook. Let us make small changes in our code and memoize this factorial calculation. So here is the new code for the same component :
import React from 'react'
function computeFactorial(num) {
if(num == 0) {
return 1;
}
return num * computeFactorial(num - 1)
}
const FactorialResult = () => {
const [num, setNum] = React.useState(0);
const factorial = React.useMemo(() => {
computeFactorial(num)
},[num]);
const handleChange = event => {
setNum(+event.target.value);
}
return (
<div>
Factorial of
<input type="number"
value={num}
onChange={handleChange} />
is {factorial}
</div>
);
}
Now every time you change the value of the num
, the computeFactorial
will get invoked but only if the num
has changed. If num
does not change on the re-render, then it will return the memoized result for its factorial and will not make that extra computeFactorial
call. I hope that makes perfect sense.
Let's see one more example to make the useMemo
hook extremely clear.
Let us say we want to return the full name of a person, so for this let us say we have a function in some component that gives us the full name:
const fullName = React.useMemo(() => {
return firstName + " " + lastName
},[firstName, lastName])
In above code, if the firstName
or lastName
change, then our fullName
function will get re-invoked because we have specified firstName
and lastName
as dependencies. Please note : functions themselves usually don't need to be re-computed, and their dependencies are mostly closure values that may change.
const fullName = React.useCallback(() => {
return firstName + " " + lastName
}, [firstName, lastName]);
Now for above piece of code when firstName
or lastName
change, we don't need a separate instance of the function on each re-render of the component, but we need exact the one and same instance of the function so that it has up to date values in the closure.
If you want to learn about the useCallback
hook, I do have an article on same :
When to use the useCallback hook ?
The Nerdy Dev ・ Jan 15 ・ 5 min read
So this is it for this article. Thanks for reading.
If you enjoy my articles, consider following me on Twitter for more interesting stuff :
⚡Twitter : https://twitter.com/The_Nerdy_Dev
Don't forget to leave a like if you loved the article. Also share it with your friends and colleagues.
PS - If you are looking to learn Web Development, I have curated a FREE course for you on my YouTube Channel, check the below article :
(2021) - Web Developer Full Course : HTML, CSS, JavaScript, Node.js and MongoDB
The Nerdy Dev ・ Apr 28 '21 ・ 2 min read
Looking to learn React.js with one Full Project, check this out :
Learn React with one BIG Project [NOTES included] - Demo and Video Link
The Nerdy Dev ・ Jun 10 '21 ・ 1 min read
This content originally appeared on DEV Community and was authored by The Nerdy Dev
The Nerdy Dev | Sciencx (2022-01-17T08:39:57+00:00) Memoizing with React.useMemo. Retrieved from https://www.scien.cx/2022/01/17/memoizing-with-react-usememo/
Please log in to upload a file.
There are no updates yet.
Click the Upload button above to add an update.