The useMemo hook helps to remember (or memoize) a value so React does not have to recalculate it on every render, improving performance.
Click to reveal answer
beginner
How do you use useMemo to optimize a slow calculation?
Wrap the slow calculation inside useMemo(() => slowCalculation(), [dependencies]). React will only recalculate when dependencies change.
Click to reveal answer
intermediate
What happens if you pass an empty dependency array [] to useMemo?
The memoized value is calculated once on the first render and never recalculated again, unless the component unmounts and remounts.
Click to reveal answer
intermediate
Can useMemo replace useState or useEffect?
No. useMemo only memoizes values. useState manages state, and useEffect runs side effects. They serve different purposes.
Click to reveal answer
intermediate
Why should you not overuse useMemo?
Because memoization itself has a cost. Use it only when a calculation is expensive and the saved work improves performance noticeably.
Click to reveal answer
What does useMemo return?
AA side effect callback
BA function to update state
CA memoized value
DA component
✗ Incorrect
useMemo returns the memoized value from the function you provide.
When does useMemo recalculate the memoized value?
AEvery render
BOnly when dependencies change
COnly on first render
DNever
✗ Incorrect
It recalculates only when one or more dependencies in the array change.
Which of these is a good use case for useMemo?
AMemoizing a heavy calculation based on props
BRunning an API call
CReplacing <code>useState</code> for state management
DMemoizing a simple string constant
✗ Incorrect
useMemo is best for expensive calculations that depend on props or state.
What happens if you omit the dependency array in useMemo?
AMemoization is disabled; recalculates every render
BMemoizes forever
CCauses an error
DMemoizes only once
✗ Incorrect
Without dependencies, React recalculates the value every render, so memoization is ineffective.
Which hook is best to run side effects, not memoize values?
AuseCallback
BuseMemo
CuseState
DuseEffect
✗ Incorrect
useEffect is designed to run side effects like data fetching or subscriptions.
Explain how useMemo helps improve React app performance.
Think about when React re-renders and how <code>useMemo</code> saves work.
You got /4 concepts.
Describe the difference between useMemo and useEffect.
One remembers values, the other runs code after render.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of the useMemo hook in React?
easy
A. To remember a computed value between renders and recalculate only if dependencies change
B. To fetch data from an API asynchronously
C. To manage component state
D. To handle side effects like subscriptions or timers
Solution
Step 1: Understand what useMemo does
useMemo stores a value and recalculates it only when its dependencies change, avoiding repeated work.
Step 2: Compare with other hooks
Fetching data or managing state are done by other hooks like useEffect or useState, not useMemo.
Final Answer:
To remember a computed value between renders and recalculate only if dependencies change -> Option A
Quick Check:
useMemo = memoize value [OK]
Hint: Remember: useMemo caches values, not effects or state [OK]
Common Mistakes:
Confusing useMemo with useEffect
Thinking useMemo manages state
Assuming useMemo runs every render
2. Which of the following is the correct syntax to use useMemo in a React functional component?
easy
A. const memoizedValue = useMemo(computeValue(), []);
B. const memoizedValue = useMemo(computeValue, dependencies);
C. const memoizedValue = useMemo(() => computeValue(), [dependencies]);
D. const memoizedValue = useMemo(() => computeValue, [dependencies]);
Solution
Step 1: Recall correct useMemo syntax
useMemo takes a function returning the value and an array of dependencies: useMemo(() => value, [deps]).
Step 2: Analyze options
const memoizedValue = useMemo(() => computeValue(), [dependencies]); correctly uses an arrow function and dependency array. Others either call the function immediately or miss the arrow function.
Final Answer:
const memoizedValue = useMemo(() => computeValue(), [dependencies]); -> Option C
Quick Check:
useMemo syntax = arrow function + deps array [OK]
Hint: useMemo needs a function and dependencies array [OK]
Common Mistakes:
Calling the compute function immediately inside useMemo
Passing dependencies without an array
Passing function reference without wrapping in arrow function
The double value is computed as count * 2, and recalculated only when count changes.
Step 2: Substitute count value
When count is 3, double becomes 3 * 2 = 6.
Final Answer:
6 -> Option A
Quick Check:
count 3 times 2 = 6 [OK]
Hint: Multiply count by 2 inside useMemo [OK]
Common Mistakes:
Confusing count with double
Ignoring dependency array effect
Assuming useMemo returns a function
4. Identify the problem in this code using useMemo:
const memoizedValue = useMemo(() => expensiveCalc(), []);
// Later in code
const result = memoizedValue();
medium
A. Dependency array is missing, so useMemo recalculates every render
B. Calling memoizedValue as a function causes an error because it stores a value, not a function
C. expensiveCalc is not defined
D. useMemo should not be used with functions
Solution
Step 1: Understand what useMemo returns
useMemo returns the memoized value, not a function, so calling it as a function causes an error.
Step 2: Analyze the code usage
The code calls memoizedValue(), but memoizedValue is the result of expensiveCalc(), not a function.
Final Answer:
Calling memoizedValue as a function causes an error because it stores a value, not a function -> Option B
Quick Check:
useMemo returns value, not callable function [OK]
Hint: useMemo returns value, don't call it like a function [OK]
Common Mistakes:
Calling the memoized value as a function
Forgetting to pass dependencies
Confusing useMemo with useCallback
5. You have a component that filters a large list of users by a search term. Which use of useMemo best improves performance by avoiding unnecessary recalculations?
hard
A. const filteredUsers = users.filter(u => u.name.includes(searchTerm));
B. const filteredUsers = useMemo(() => users.filter(u => u.name.includes(searchTerm)), []);
C. const filteredUsers = useMemo(() => users.filter(u => u.name.includes(searchTerm)));