USE STATE HOOK
Srashti Gupta

Srashti Gupta @srashtigupta

About: MERN Stack Developer with 3+ years of experience in building full-stack web apps. Passionate about exploring new technologies and bringing creative ideas to life.

Location:
Jaipur Rajasthan
Joined:
Feb 18, 2025

USE STATE HOOK

Publish Date: Jun 4
1 2

Here’s your improved blog post with a clear explanation and practical example of useState, making it even more helpful and approachable for readers:


Mastering State and Immutability in React Functional Components

Why I Wrote This Post

As I dove deeper into React development, I often found myself puzzled by how state management works in functional components—especially when dealing with complex data types like arrays and objects. I wrote this post to share what I’ve learned about using the useState hook effectively, and to help you avoid common pitfalls that can trip up even experienced developers. If you’re looking to write cleaner, more efficient React code, this guide is for you!


Setting a cover image helps your post stand out on the home feed and social media!


Understanding State in React Functional Components

React’s state is a powerful way to store and manage data within your components. In class components, you might use this.state, but in functional components, React gives us hooks—especially the useState hook.

What is useState?

The useState hook lets you add state to your functional components. It can hold any type of data: strings, numbers, booleans, arrays, objects, or even more complex structures[1][5][7]. Here’s how you can use it with different data types:

import { useState } from "react";

const [value, setValue] = useState('');    // String
const [list, setList] = useState([]);      // Array
const [obj, setObj] = useState({});        // Object
const [count, setCount] = useState(0);     // Number
Enter fullscreen mode Exit fullscreen mode
  • value: The current state value.
  • setValue: The function to update that state.

Example: A Simple Counter

Here’s a classic example to show how useState works in practice—a button that counts how many times it’s clicked:

import React, { useState } from 'react';

function Counter() {
  // Declare a state variable named 'count', initialized to 0
  const [count, setCount] = useState(0);

  return (

      You clicked {count} times
       setCount(count + 1)}>
        Click me


  );
}
Enter fullscreen mode Exit fullscreen mode
  • useState(0) creates a state variable count with an initial value of 0.
  • setCount updates the value of count.
  • Every button click increases the count by 1, and the UI updates automatically[3][4][5][6].

Updating State

Depending on your data type, you’ll update state like this:

setCount(prev => prev + 1);                // Number
setValue('newValue');                      // String
setIsTrue(true);                           // Boolean
setList(prev => [...prev, newItem]);       // Array
setObj(prev => ({ ...prev, name: 'Writer' })); // Object
Enter fullscreen mode Exit fullscreen mode

Key Principles

  • Immutability: Never mutate the original object or array. Always create a new copy with the necessary changes.
  • Spread Operator (...): Use it to copy arrays and objects efficiently.
  • Functional Updates: When the new state depends on the previous state, use the functional form (e.g., setState(prev => ...)) for accuracy, especially with async updates.

Why Immutability Matters for Performance

Creating new references with useState directly supports React’s shallow comparison strategy:

  • Efficient Change Detection: React can quickly tell if something changed by comparing references, not deep values.
  • Minimized Re-renders: If the reference hasn’t changed, React skips unnecessary re-renders, improving performance.
  • Optimized Virtual DOM Diffing: Only the parts of the UI that need to change are updated.

Common Pitfalls with the Spread Operator

  • Shallow Copy Only: The spread operator only copies the top level. Nested objects or arrays are still referenced, which can lead to bugs if mutated.
  • Direct Mutation Before Copy: Accidentally mutating the original before copying (e.g., arr.push(x) then [...arr]) still mutates the original data.
  • Overusing Spread: Excessive use can make code harder to read and, in rare cases, affect performance.
  • Order of Properties: When merging objects, later properties override earlier ones—be mindful of the order.

Summary

React’s useState hook is a cornerstone for managing state in functional components. By following the principles of immutability and using the spread operator wisely, you can build robust, efficient, and bug-free applications.


Let’s Discuss!

I’d love to hear from you:

  • What challenges have you faced with state management in React?
  • Do you have tips or best practices to share?
  • Any questions about immutability or the spread operator?

Drop your thoughts in the comments below—let’s spark a great discussion!

[1] https://www.w3schools.com/react/react_usestate.asp
[2] https://daveceddia.com/usestate-hook-examples/
[3] https://legacy.reactjs.org/docs/hooks-state.html
[4] https://react.dev/reference/react/useState
[5] https://blog.logrocket.com/guide-usestate-react/
[6] https://www.freecodecamp.org/news/usestate-hook-3-different-examples/
[7] https://hygraph.com/blog/usestate-react
[8] https://www.youtube.com/watch?v=O6P86uwfdR0

Comments 2 total

Add comment