Bird
Raised Fist0
Reactframework~8 mins

Updating state in React - Performance & Optimization

Choose your learning style10 modes available
Performance: Updating state
HIGH IMPACT
This affects how quickly the UI updates after user interaction and how smoothly the app responds to input.
Updating multiple related state values in a React component
React
const [state, setState] = useState({ count: 0, text: '' });

function updateBoth() {
  setState(prev => ({ ...prev, count: prev.count + 1, text: 'Updated' }));
}
Single state update batches changes, causing only one re-render and layout recalculation.
📈 Performance GainTriggers 1 re-render and 1 layout recalculation, improving responsiveness
Updating multiple related state values in a React component
React
const [count, setCount] = useState(0);
const [text, setText] = useState('');

function updateBoth() {
  setCount(count + 1);
  setText('Updated');
}
Multiple separate state updates cause multiple re-renders, slowing UI responsiveness.
📉 Performance CostTriggers 2 re-renders and 2 layout recalculations per update
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Multiple separate state updatesMultiple updates to virtual DOMMultiple reflows triggeredHigher paint cost due to repeated updates[X] Bad
Single batched state updateOne update to virtual DOMSingle reflow triggeredLower paint cost with one update[OK] Good
Rendering Pipeline
When state updates, React schedules a re-render of the component. This triggers the browser's style calculation, layout, paint, and composite steps to update the UI.
→JavaScript execution
→Style Calculation
→Layout
→Paint
→Composite
⚠️ BottleneckMultiple state updates cause repeated JavaScript execution and layout recalculations, increasing input delay.
Core Web Vital Affected
INP
This affects how quickly the UI updates after user interaction and how smoothly the app responds to input.
Optimization Tips
1Batch multiple related state updates into one to reduce re-renders.
2Use functional updates to avoid stale state and unnecessary renders.
3Avoid updating state in ways that cause layout thrashing or repeated DOM changes.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance problem with calling multiple setState functions separately in React?
AIt increases the bundle size significantly.
BIt causes multiple re-renders and layout recalculations.
CIt blocks the main thread for several seconds.
DIt causes the browser to reload the page.
DevTools: React DevTools and Performance panel
How to check: Open React DevTools Profiler, record while triggering state updates, then check number of renders. Use Performance panel to see layout and paint events.
What to look for: Look for fewer component renders and shorter layout/paint durations indicating efficient state updates.

Practice

(1/5)
1. What is the correct way to update a state variable count using the useState hook in React?
easy
A. Call the setter function like setCount(newValue) to update the state.
B. Directly assign a new value like count = newValue.
C. Use this.setState({ count: newValue }) inside the component.
D. Update the state by returning a new value from the component function.

Solution

  1. Step 1: Understand how useState works

    The useState hook returns a pair: the current state and a function to update it.
  2. Step 2: Use the setter function to update state

    To change the state, you must call the setter function with the new value, e.g., setCount(newValue).
  3. Final Answer:

    Call the setter function like setCount(newValue) to update the state. -> Option A
  4. Quick Check:

    Update state with setter function = A [OK]
Hint: Always use the setter function from useState to update state [OK]
Common Mistakes:
  • Trying to assign state variable directly
  • Using class component syntax in functional components
  • Returning new value instead of calling setter
2. Which of the following is the correct syntax to initialize a state variable name with value "John" using useState?
easy
A. const name = useState('John');
B. const name = useState('John')[0];
C. const [name, setName] = useState('John');
D. const {name, setName} = useState('John');

Solution

  1. Step 1: Recall useState returns an array

    The useState hook returns an array with two elements: the state variable and the setter function.
  2. Step 2: Use array destructuring to get both

    Use array destructuring syntax: const [name, setName] = useState('John'); to get both the value and setter.
  3. Final Answer:

    const [name, setName] = useState('John'); -> Option C
  4. Quick Check:

    useState returns [state, setter] array = B [OK]
Hint: Use array destructuring to get state and setter from useState [OK]
Common Mistakes:
  • Assigning useState result directly without destructuring
  • Using object destructuring instead of array
  • Only taking the first element without setter
3. What will be the output of the following React component when the button is clicked once?
import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);
  const handleClick = () => {
    setCount(count + 1);
    setCount(count + 1);
  };
  return (
    <>
      

{count}

Increment </> ); }
medium
A. 2
B. 0
C. Error
D. 1

Solution

  1. Step 1: Understand state updates are asynchronous and batched

    Both setCount(count + 1) calls use the same count value (0) because state updates are batched.
  2. Step 2: Result after both calls

    Both calls set count to 1, so after clicking, count becomes 1, not 2.
  3. Final Answer:

    1 -> Option D
  4. Quick Check:

    Multiple setState with same value = C [OK]
Hint: Multiple setState calls with same value batch to last one [OK]
Common Mistakes:
  • Assuming count increments twice immediately
  • Expecting count to be 2 after two calls
  • Ignoring React's batching behavior
4. Identify the error in the following React component that tries to update state on button click:
import React, { useState } from 'react';

function Toggle() {
  const [isOn, setIsOn] = useState(false);
  function handleClick() {
    isOn = !isOn;
  }
  return {isOn ? 'ON' : 'OFF'};
}
medium
A. Button missing onClick handler.
B. Directly assigning to state variable instead of using setter.
C. Using incorrect initial state value.
D. Missing parentheses in function declaration.

Solution

  1. Step 1: Check how state is updated

    The code tries to assign isOn = !isOn; directly, which is not allowed for state variables.
  2. Step 2: Correct way to update state

    State must be updated by calling the setter function: setIsOn(!isOn);.
  3. Final Answer:

    Directly assigning to state variable instead of using setter. -> Option B
  4. Quick Check:

    Update state only via setter function = D [OK]
Hint: Never assign state variable directly; always use setter [OK]
Common Mistakes:
  • Assigning state variable directly
  • Forgetting to call setter function
  • Confusing state variable with setter
5. You want to update a state object user with a new age property without losing other properties. Which is the correct way to update state using setUser?
const [user, setUser] = useState({ name: 'Alice', age: 25 });

// Update age to 26
hard
A. setUser(prevUser => ({ ...prevUser, age: 26 }));
B. setUser({ age: 26 });
C. setUser(user.age = 26);
D. setUser(prevUser => { prevUser.age = 26 });

Solution

  1. Step 1: Preserve existing properties when updating state object

    To update one property without losing others, copy previous state using spread syntax.
  2. Step 2: Use functional update form to get latest state

    Use setUser(prevUser => ({ ...prevUser, age: 26 })) to merge old properties with new age.
  3. Final Answer:

    setUser(prevUser => ({ ...prevUser, age: 26 })); -> Option A
  4. Quick Check:

    Use spread and functional update to merge state = A [OK]
Hint: Use spread operator and functional setter to update object state [OK]
Common Mistakes:
  • Replacing whole object losing other properties
  • Mutating state directly instead of returning new object
  • Not using functional update when depending on previous state
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