DEV Community

Cover image for Deep dive into React: State Management Types and its Importance
Opuama Lucky
Opuama Lucky

Posted on

Deep dive into React: State Management Types and its Importance

Introduction

State management is a key concept in React, a popular JavaScript library for creating user interfaces. The data that changes within a component or application is referred to as its state. It entails handling an application’s state in a way that ensures consistency and avoids bugs.

State management in React can be accomplished using various techniques such as React’s built-in useState hook or external libraries such as Redux or MobX. It also provides a simple and flexible API to support state management in a React component. The useState hook is the most straightforward way to manage state within a component. It enables us to declare a state variable and update it as required.

In this article, you will understand in detail how the various type of state management operate and also the importance of state management

Outline:

What is a State
What is State Management
What is State Management in React
Types of State Management in React
Top 5 State Management Libraries
Importance of State Management

what is a state

State represents the value of a dynamic property of a React component at a given instance. React provides a dynamic data store for each component. The internal data represents the state of a React component and can be accessed using ‘this.state’ member variable of the component. Whenever the state of the component is changed, the component will re-render itself by calling the render() method along with the new state.

What is State Management in React

State management is the process of managing and maintaining an application’s data or state. An application’s state in software development refers to the current values and configurations of all its variables, objects, and components. State management is the process of managing an application’s state so that it can be easily accessed and manipulated by different components of the application.

State management is very important in modern web development, where complex applications are built with multiple interconnected components. A centralized state management system makes it easier to keep track of the application’s state, synchronize it across components, and manage state changes over time. React allows developers to update the state of a component and trigger a re-render of the component.

Types of State Management in React

The type of state management to manage a React app depends on the size and complexity of the application.
There are four main types of state you need to properly manage in your React app:

  • Local state
  • Global state
  • Server state
  • URL state

Local State

Local state in React refers to a state that is managed within a component and is not accessible to other components. It is the most straightforward type of state to manage in React.

Local state is defined using the useState hook, which is a built-in React hook that allows you to add state to a functional component. The useState hook returns an array with two elements: the current state value and a function to update that value.

Here’s an example of how to use the ‘useState’ hook to manage local

import React, { useState } from ‘react’;

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

function handleClick() {
setCount(count + 1);
}


return (
<div>
<p>Count: {count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
}
Enter fullscreen mode Exit fullscreen mode

From the above code, The ‘useState’ hook is used to manage the count state variable. The handleClick function uses the setCount function to update the count variable, which causes the component to be re-rendered with the updated state.

But useReducer is more dynamic than useState because it includes a built-in way to perform a variety of different state operations with the help of the reducer function.

Global State

Global state in React refers to state data that is shared by multiple components in an application. This is useful for managing application-wide data, such as user authentication status, theme settings, or API data.

There are several approaches to implementing global state in React, but one popular method is to use a state management library such as Redux, MobX, or Context API.

Here’s an example of how to implement global state in a React application using the Context API:// App.js

import React, { useState } from ‘react’;
import { UserContext } from ‘./UserContext’;
import Header from ‘./Header’;
import MainContent from ‘./MainContent’;

function App() {
const [user, setUser] = useState(null);

return (
<UserContext.Provider value={{ user, setUser }}>
<Header />
<MainContent />
</UserContext.Provider>
);
}
Enter fullscreen mode Exit fullscreen mode

The useState hook is used in the code above to define a user state variable and a setUser function to update it. Then, we create a UserContext object using the Context API’s create Context function and use the same API’s Provider component to make the user and setUser values available to all child components wrapped by the Provider.

We can use the useContext hook in the child components to get the user value from the global state. This value, is then used to display a welcome message in the application’s header. Like the code below:

// Header.js
import React, { useContext } from ‘react’;
import { UserContext } from ‘./UserContext’;

function Header() {
const { user } = useContext(UserContext);

return (
<div>
<p>Welcome, {user ? user.name : ‘Guest’}!</p>
</div>
);
}
Enter fullscreen mode Exit fullscreen mode

Server State

Server state is generated or fetched on the server side and then passed down as props to the client-side React application. It can be useful for improving application performance and reducing the amount of work required by client-side JavaScript code.

Here’s an example of how to use server state in a React application:

// server.js (Node.js example)

const express = require(‘express’);
const React = require(‘react’);
const ReactDOMServer = require(‘react-dom/server’);
const App = require(‘./App’);

const app = express();

app.get(‘/’, (req, res) => {
const initialState = { count: 0 };
const appString = ReactDOMServer.renderToString(<App {…initialState} />);
res.send(
<html>
<head>
<title>My React App</title>
</head>
<body>
<div id="app">${appString}</div>
<script>
window.__INITIAL_STATE__ = ${JSON.stringify(initialState)};
</script>
<script src="/bundle.js"></script>
</body>
</html>
);
});

app.listen(3000, () => {
console.log(‘Server started on port 3000’);
});
Enter fullscreen mode Exit fullscreen mode

The code above creates a simple Node.js server that will convert a React application to an HTML string and send it to the client. We also define an initial state object with a count property set to zero.

Using the spread operator, we then pass this initial state object to the App component as props. The initial state object is also embedded in a script> tag, which sets a global variable called INITIAL STATE.

In the client-side JavaScript code, we import the useState hook and define a count state variable and a setCount function to update it. We also use the initial count value passed down as props to set the initial state of the component. Like the code above:

// App.js

import React, { useState } from ‘react’;

function App(props) {
const [count, setCount] = useState(props.count);

const handleClick = () => {
setCount(count + 1);
};

return (
<div>
<p>Count: {count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
}

export default App;
Enter fullscreen mode Exit fullscreen mode

URL State

URL state refers to storing and managing the application state via the browser’s URL. This can be useful for creating shareable links containing information about the application’s current state, as well as allowing users to bookmark specific states of the application.

There are several approaches to implementing URL state in React, but one popular method is to use a third-party library, such as React Router.

Here’s an example of how to use React Router in a React application to implement URL state:

// App.js
import React from ‘react’;
import { BrowserRouter as Router, Switch, Route, Link } from ‘react-router-dom’;
import Home from ‘./Home’;
import ProductList from ‘./ProductList’;
import ProductDetail from ‘./ProductDetail’;

function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to=”/”>Home</Link>
</li>
<li>
<Link to=”/products”>Products</Link>
</li>
</ul>
</nav>

<Switch>
<Route path=”/products/:id” component={ProductDetail} />
<Route path=”/products” component={ProductList} />
<Route path=”/” component={Home} />
</Switch>
</div>
</Router>
);
}
Enter fullscreen mode Exit fullscreen mode

The preceding code defines a basic React application with three pages: Home, ProductList, and ProductDetail. To wrap up our application and provide routing functionality, we use the BrowserRouter component from React Router.

We also define two links in a navigation bar that use the React Router Link component to navigate between pages. The Link component creates an HTML link that updates the browser’s URL without reloading the entire page.

In the ProductList component, we use the useParams hook from React Router to access the current URL parameter. By defining a list of products and using the Link component to generate links that include the id of each product in the URL.

// ProductList.js
import React from ‘react’;
import { Link } from ‘react-router-dom’;

function ProductList() {
const products = [
{ id: 1, name: ‘Product 1’ },
{ id: 2, name: ‘Product 2’ },
{ id: 3, name: ‘Product 3’ }
];

return (
<div>
<h2>Product List</h2>

<ul>
{products.map(product => (
<li key={product.id}>
<Link to={/products/${product.id}}>{product.name}</Link>
</li>
))}
</ul>
</div>
);
}

export default ProductList;
Enter fullscreen mode Exit fullscreen mode

The useParams hook is used in the ProductDetail component to access the current URL parameter and to fetch and display the details of the selected product:

// ProductDetail.js
import React, { useEffect, useState } from ‘react’;
import { useParams } from ‘react-router-dom’;

function ProductDetail() {
const { id } = useParams();
const [product, setProduct] = useState(null);

useEffect(() => {
// Fetch product details based on the URL parameter
fetch(/api/products/${id})
.then(response => response.json())
.then(data => setProduct(data));
}, [id]);

if (!product) {
return <div>Loading…</div>;
}

return (
<div>
<h2>{product.name}</h2
Enter fullscreen mode Exit fullscreen mode

Top 5 State Management in React

A state management library is a tool or framework that helps developers manage and maintain application state in a structured and efficient manner. It provides a centralized store or mechanism for storing and updating this data, and it frequently includes tools for managing the complexity of state changes in larger applications.

state management libraries for React:

state management library is a tool or framework that helps developers manage and maintain application state in a structured and efficient manner. It provides a centralized store or mechanism for storing and updating this data, and it frequently includes tools for managing the complexity of state changes in larger applications.

Here are five popular state management libraries for React:

Redux:

Redux is a well-known state management library in the React ecosystem. It provides a centralized store for managing the application state and employs a unidirectional data flow architecture that makes reasoning about your application’s state simple. Redux also has a robust ecosystem of plugins and extensions, making it an extremely versatile tool for managing state in React applications.

MobX:

MobX is another popular React state management library, that offers a simple and more intuitive way of managing state than Redux. It employs a reactive programming model that automatically updates the state of your application whenever data changes, making it easier to write and maintain code.

Vuex:

Vuex is a Vue.js state management library that provides a centralized store for managing application state. It also has features like state snapshots, time-travel debugging, and a module-based architecture.

Recoil:

Recoil is a newer React state management library that aims to be easier and more intuitive than Redux. It employs a “recoil” model that allows you to define state atoms and selectors while providing a set of hooks that make reading and writing to those atoms simple.

Zustand:

Zustand is a lightweight React state management library that provides a simple and intuitive way of managing states by utilizing the React hooks API. It has a small API surface area and is simple to learn and use, making it an excellent choice for smaller projects or simple state management requirements.

Importance of State Management in React

State management is an important concept in modern web development because it allows web applications to keep their data and user interface up to date in response to user actions and events. Here are some of the key reasons why state management is important:

Helps manage application complexity: As the size and complexity of web applications grow, maintaining and updating state can become difficult. By providing a centralized mechanism for managing application state, state management techniques and tools aid developers in managing this complexity.
Enables dynamic user interfaces: Web applications can use state management to create dynamic user interfaces that respond to user interactions, events, and data changes. A dynamic user interface is critical for providing a consistent user experience and increasing user engagement.
Improves application performance: Efficient state management can improve application performance by reducing the number of unnecessary updates and data transfers between the client and server.
Enables application testing and debugging: Testing and debugging web applications make effective state management critical. State management techniques can help developers identify and resolve bugs and other issues more quickly and efficiently by providing a clear, and predictable way to manage the application state.
Facilitates collaboration: More than one developer can work on the same application without interfering with each other’s work. Thanks to state management. State management can help developers avoid conflicts and ensure that everyone is working toward the same goals.

Conclusion

State management in React is an important and ongoing challenge for any React project. Managing it effectively requires not only the right state management tool but also a clear understanding of the various types and having the right people on your team to build a healthy react project.

Top comments (4)

Collapse
 
httpjunkie profile image
Eric Bishard

Can you link up the table of contents? I'd love to share.

Collapse
 
green8888elephant profile image
Kostya

Never used MobX, Redux quite hard to configure and sometimes it's overhead.
Jotai is a cool atom library, if you only need share some data between components

Collapse
 
donaldx9 profile image
Donaldx9

React is great

Collapse
 
webjose profile image
José Pablo Ramírez Vargas

Sarcastic?