What the Hook is State?
In React, there are a few key concepts you’re going to encounter, one of them is useState
. Any sort of forms, toggles, or lists can all be managed by state without having to manually manipulate the DOM. The ability to only re-render the component that state lives in is a huge win in terms of speed. If you don’t know how to use it, I am going to try to help you understand what's being re-rendered, what state is storing, how we define it, and understand state... as I understand it...
Defining State: Short and Sweet
React’s state can be summarized as:
Data that can change over time:
Unlike props, which are passed down from a parent, state belongs to a component itself and can be updated from within that component.Controls rendering:
When state updates, React re-renders the component so the UI always reflects the latest data.Managed with Hooks or setState:
Functional Components:
useState
,useEffect
, and other Hooks.Class Components:
this.setState()
and lifecycle methods.
State is at the heart of how React works, so getting comfortable with it early on is a big help. As your applications grow, tools like React DevTools become incredibly useful for double-checking that your state updates match what you expect to see on the screen.
Where Can I “See” State in My App?
“Managing state” can feel a bit abstract—after all, there’s no single state.js
file you can open to watch changes happen in real time. Luckily, there are still very practical ways to observe and confirm exactly what data your components are holding in state.
In Your Code
When you’re using functional components, you’ll typically manage state with useState
. For example:
const [count, setCount] = useState(0);
Here, 0
is the initial state value, and each time you call setCount
, the value of count
changes throughout your code. Those changes in count
are a direct demonstration of how state works in React.
Console Logging
It’s sometimes helpful for learning or debugging to log your state variables to the console. For example:
console.log(count);
This logs the changing count
value each time state updates.
In Your App
Every time you update state—like incrementing a counter, toggling a switch, or typing into an input—the user interface is re-rendered to show this new state. You see the result of state changes directly in the browser. That’s the visible side of state.
What is the Syntax and Why?
Here’s a simple breakdown of the syntax you’ll see when using React’s useState
Hook:
const [count, setCount] = useState(0);
We saw this example earlier; this is a very simple and common definition of state in a functional component:
Array Destructuring: The square brackets mean we’re using JavaScript’s array destructuring. The first item,
count
, represents the current value of your state, and the second item,setCount
, is a function that lets you updatecount
. (Note, you can name the function banana, newCount, fordF150; however, “set”+the initial variable is the standard convention. While not mandatory, convention does make readability easier when working with others.)Initial Value: Whatever you put inside the parentheses of
useState(...)
is your initial state value. Here,0
meanscount
will start at zero.Updating State: To change the value of
count
, callsetCount(newValue)
. This tells React to update the component’s state and then re-render the UI to show your newcount
.
What Can I Store in “State”?
State is versatile—you can store just about anything that needs to change over time. Whether it’s a simple number (like a counter), a string of text (like a username input), a boolean for toggling something on and off, or even complex data such as an array of user objects from an API fetch, it all belongs in state if it influences what your component displays. The key is to remember that once you put data in state, React will automatically re-render whenever that data updates.
State: A Practical Example
There’s some “contextual” code missing from here, but this is an example from when I used state in a recent project of my own:
const [formData, setFormData] = useState({
title: '',
director: '',
genre: '',
year: ''
});
const handleChange = (event) => {
const { name, value } = event.target;
setFormData((prevFormData) => ({
...prevFormData,
[name]: value
}));
};
const handleSubmit = (event) => {
event.preventDefault();
const newMovie = { ...formData };
handleAddMovie(newMovie);
setFormData({
title: '',
director: '',
genre: '',
year: ''
});
};
Let's now walk through it, focusing just on how we're using that syntax and how it adheres to the topics covered earlier:
Declaring State
formData
is the current state—an object holding the user’s input for the movie fields.setFormData
is the function used to updateformData
.
Updating State
Whenever the user types into an input,
handleChange
updates the state by creating a new object (using the spread operator) and setting the field[name]
tovalue
.This ensures you don’t overwrite the other fields in
formData
by using a non-destructive array iterator.
Using State on Submit
On form submission,
newMovie
is created from the currentformData
or “the current state of the form.”handleAddMovie
uses that data (maybe saving it to a list somewhere else in your app).setFormData
then resets the state to clear out the form inputs.
By keeping the user’s inputs in state, React automatically re-renders the component whenever formData
changes—so the input fields always display what the user is typing, and the parent knows exactly what movie data is being submitted.
Wrapping It All Up
By now, you’ve seen how state can power everything from counters and toggles to form inputs and complex lists. The key points to remember are:
State is data that changes over time and needs to be reflected in the UI, “State is data that is dynamic.”
Whenever state changes, React re-renders only the affected components.
You can inspect state in your code, in the browser via console logs, or by using handy tools like React DevTools.
State is easy to declare with the
useState
Hook, and you can store all kinds of data in it, from numbers and strings to arrays and objects.
As you keep learning, you’ll discover that a solid understanding of state makes your components more dynamic and interactive, all while staying organized and readable. Now you should be able to understand state... well... at least as I understand it. Happy coding, everyone!