State management is a crucial concept in React. State allows components to dynamically update UI based on data changes.

However, managing state properly takes some practice. Let’s walk through the basics of handling state in React:

Creating State

The useState hook defines state variables:

1
2
3
4
5
import { useState } from 'react';

function Example() {
  const [count, setCount] = useState(0);
}

useState accepts the initial state value and returns:

  • The current state
  • A function to update it

Reading State

To display state in UI, simply reference the variable:

1
<p>You clicked {count} times</p>

React will re-render components on state change to reflect new values.

Updating State

Call the setter function to update state:

1
2
3
4
5
const increment = () => {
  setCount(prevCount => prevCount + 1);
}

<button onClick={increment}>Increment</button>

Always use the setter - don’t modify state directly.

State Batching

State updates are batched for better performance:

1
2
3
4
5
6
7
const [count, setCount] = useState(0);

const increment3Times = () => {
  setCount(c => c + 1);
  setCount(c => c + 1); 
  setCount(c => c + 1);
}

This will only increment once instead of 3 times.

State Dependency

State values are guaranteed to be up-to-date if they are declared within the same component:

1
2
3
4
5
6
7
const [count, setCount] = useState(0); // count is always fresh

const increment = () => {
  setCount(c => c + 1);
  
  console.log(count); // 0 (not updated yet)
}

Summary

  • useState hook declares state variables
  • Reference state variables to display state
  • Call setters to update state
  • Updates are batched for performance
  • State within a component is always fresh

Correctly managing local component state is a key React skill. State allows powerful, dynamic applications.