Bird
Raised Fist0
Reactframework~8 mins

useMemo hook in React - Performance & Optimization

Choose your learning style10 modes available
Performance: useMemo hook
MEDIUM IMPACT
This affects the rendering speed and responsiveness by avoiding unnecessary recalculations during component renders.
Optimizing expensive calculations inside a React functional component
React
import { useMemo } from 'react';
function Component({items}) {
  const total = useMemo(() => items.reduce((sum, item) => sum + item.value, 0), [items]);
  return <div>Total: {total}</div>;
}
Calculation runs only when items change, reducing CPU load and speeding up renders.
📈 Performance GainReduces CPU work and improves INP by avoiding redundant recalculations
Optimizing expensive calculations inside a React functional component
React
function Component({items}) {
  const total = items.reduce((sum, item) => sum + item.value, 0);
  return <div>Total: {total}</div>;
}
The calculation runs on every render even if items haven't changed, causing unnecessary CPU work and slower interaction.
📉 Performance CostBlocks rendering for each render, increasing INP and CPU usage
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Without useMemoNo changeMultiple reflows if calculation triggers state changesHigher paint cost due to slower JS[X] Bad
With useMemoNo changeSingle reflow if dependencies changeLower paint cost due to cached results[OK] Good
Rendering Pipeline
useMemo caches the result of a calculation between renders, so React skips recalculating the value if dependencies haven't changed.
→JavaScript Execution
⚠️ BottleneckJavaScript Execution when recalculations are expensive
Core Web Vital Affected
INP
This affects the rendering speed and responsiveness by avoiding unnecessary recalculations during component renders.
Optimization Tips
1Use useMemo to cache expensive calculations that depend on specific inputs.
2Avoid useMemo for cheap or simple calculations to prevent unnecessary overhead.
3Always include all dependencies in the useMemo dependency array to avoid stale values.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance benefit of using useMemo in React?
AIt caches expensive calculations to avoid repeating them on every render.
BIt delays rendering until the user interacts with the component.
CIt reduces the size of the JavaScript bundle.
DIt automatically batches multiple state updates.
DevTools: Performance
How to check: Record a performance profile while interacting with the component. Look for long scripting tasks caused by recalculations.
What to look for: Reduced scripting time and fewer recalculations when props/state do not change indicate good useMemo usage.

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

  1. Step 1: Understand what useMemo does

    useMemo stores a value and recalculates it only when its dependencies change, avoiding repeated work.
  2. Step 2: Compare with other hooks

    Fetching data or managing state are done by other hooks like useEffect or useState, not useMemo.
  3. Final Answer:

    To remember a computed value between renders and recalculate only if dependencies change -> Option A
  4. 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

  1. Step 1: Recall correct useMemo syntax

    useMemo takes a function returning the value and an array of dependencies: useMemo(() => value, [deps]).
  2. 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.
  3. Final Answer:

    const memoizedValue = useMemo(() => computeValue(), [dependencies]); -> Option C
  4. 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
3. Consider this React code snippet:
const [count, setCount] = useState(0);
const double = useMemo(() => count * 2, [count]);

return <div>{double}</div>;

What will be displayed when count is 3?
medium
A. 6
B. 3
C. 0
D. NaN

Solution

  1. Step 1: Understand the useMemo calculation

    The double value is computed as count * 2, and recalculated only when count changes.
  2. Step 2: Substitute count value

    When count is 3, double becomes 3 * 2 = 6.
  3. Final Answer:

    6 -> Option A
  4. 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

  1. Step 1: Understand what useMemo returns

    useMemo returns the memoized value, not a function, so calling it as a function causes an error.
  2. Step 2: Analyze the code usage

    The code calls memoizedValue(), but memoizedValue is the result of expensiveCalc(), not a function.
  3. Final Answer:

    Calling memoizedValue as a function causes an error because it stores a value, not a function -> Option B
  4. 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)));
D. const filteredUsers = useMemo(() => users.filter(u => u.name.includes(searchTerm)), [users, searchTerm]);

Solution

  1. Step 1: Identify dependencies for filtering

    The filtered list depends on both users and searchTerm, so both must be in the dependency array.
  2. Step 2: Evaluate each option

    const filteredUsers = useMemo(() => users.filter(u => u.name.includes(searchTerm)), [users, searchTerm]); correctly recalculates only when users or searchTerm change. const filteredUsers = useMemo(() => users.filter(u => u.name.includes(searchTerm)), []); never recalculates after first render. const filteredUsers = useMemo(() => users.filter(u => u.name.includes(searchTerm))); misses dependencies array. const filteredUsers = users.filter(u => u.name.includes(searchTerm)); recalculates every render.
  3. Final Answer:

    const filteredUsers = useMemo(() => users.filter(u => u.name.includes(searchTerm)), [users, searchTerm]); -> Option D
  4. Quick Check:

    Include all dependencies in useMemo array [OK]
Hint: Always list all variables used inside useMemo in dependencies [OK]
Common Mistakes:
  • Leaving dependency array empty when dependencies exist
  • Omitting dependency array causing recalculation every render
  • Not using useMemo and filtering every render
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard