DEV Community

tokochi
tokochi

Posted on

Was Redux Over-Hyped?

Image description

As a React developer, I have had the opportunity to work on a variety of projects using different technology stacks. One stack that I have found particularly useful for building scalable and maintainable applications is the combination of React and Redux. In this article, I'll share my experience using Redux Toolkit with React and address the question of whether or not Redux was over-hyped.

First, let me provide some context. Redux is a state management library that can be used with any JavaScript framework or library, but it is most commonly used with React. The basic idea behind Redux is to store the entire state of your application in a single store, and to use actions and reducers to modify that state.

My first experience using Redux with React was on a medium-sized project, and I quickly realized the benefits of using a centralized state management system. It made it easier to track changes in state, and to debug any issues that arose.

One of the key concepts in Redux is the use of actions and reducers. Actions are simple objects that represent a change in state, and reducers are functions that determine how the state should be updated based on the action.

The flow of data in a Redux application is as follows:

  1. The user interacts with the application's UI, triggering an action.
  2. The action is an object that describes what happened in the application. It contains information about the event, such as the type of action and any associated data.
  3. The action is dispatched to the Redux store using the dispatch method.
  4. The Redux store passes the action to all of its reducers.
  5. Each reducer is responsible for updating a specific part of the state tree. It uses a switch statement to determine what action was dispatched and what changes to make to the state.
  6. The updated state is returned by the reducer and saved in the store.
  7. The updated state is then propagated to all connected React components, causing a re-render.
  8. The updated UI reflects the new state, completing the cycle.

Image description

This flow allows you to manage the entire state of your application in a single place, making it easier to debug and maintain. It also ensures that changes to the state are made in a predictable and consistent way, making your application more stable and reliable.

Here an example that demonstrates how to use actions and reducers in Redux:

// Action
const incrementCounter = {
  type: "INCREMENT_COUNTER"
};

// Reducer
function counterReducer(state = 0, action) {
  switch (action.type) {
    case "INCREMENT_COUNTER":
      return state + 1;
    default:
      return state;
  }
}

// Store
import { createStore } from "redux";
const store = createStore(counterReducer);

// Dispatching the action
store.dispatch(incrementCounter);

console.log(store.getState()); // 1


Enter fullscreen mode Exit fullscreen mode

Another great feature of Redux is its ability to handle asynchronous actions using middleware, such as the redux-thunk middleware. This allows you to dispatch asynchronous actions, such as making an API call, and to update the state when the data is received.

You can also handle asynchronous actions easily in Redux:


// Action
function fetchData() {
  return function(dispatch) {
    fetch("https://api.example.com/data")
      .then(response => response.json())
      .then(data => {
        dispatch({
          type: "FETCH_DATA_SUCCESS",
          payload: data
        });
      });
  };
}

// Reducer
function dataReducer(state = [], action) {
  switch (action.type) {
    case "FETCH_DATA_SUCCESS":
      return action.payload;
    default:
      return state;
  }
}

// Store
import { createStore, applyMiddleware } from "redux";
import thunk from "redux-thunk";
const store = createStore(dataReducer, applyMiddleware(thunk));

// Dispatching the action
store.dispatch(fetchData());


Enter fullscreen mode Exit fullscreen mode

However, some developers have criticized Redux for being overly complex and verbose. Writing and maintaining Redux code can be a challenge, especially for new or inexperienced developers. This led some people to question whether or not Redux was over-hyped.

Enter Redux Toolkit, which is a set of tools and conventions for writing Redux logic more easily and efficiently. It provides a more concise and simplified way to write and manage state in Redux, making it a popular choice for many developers.

Image description
One of the key features of Redux Toolkit is its use of the createSlice function. This function provides a simple and intuitive way to define and manage state slices, eliminating the need for repetitive and boilerplate code.

import { createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: {
    value: 0
  },
  reducers: {
    increment: state => {
      state.value += 1;
    },
    decrement: state => {
      state.value -= 1;
    }
  }
});

export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;

Enter fullscreen mode Exit fullscreen mode

In this example, we use the createSlice function to define a state slice for a counter. The slice includes two reducers, increment and decrement, which allow us to update the state of the counter.

Redux Toolkit also includes powerful tools for handling asynchronous actions, such as thunks, and provides optimizations for performance, such as memoization. This makes it easier to manage complex state changes, especially when dealing with asynchronous operations.

In overall, my experience using Redux with React has been very positive. The centralized state management and ability to handle asynchronous actions have made it easier to build scalable and maintainable applications. It is a matter of personal opinion whether or not Redux was over-hyped. Some developers feel that Redux provides a simple and elegant solution for state management, while others feel that it can be too complex and unnecessary for smaller projects.

For larger applications, Redux can be very useful in helping to manage complex state changes, particularly when dealing with asynchronous actions. It provides a clear and predictable way to update state, which can make it easier to understand and maintain the code.

Image description
However, for smaller projects, the added complexity of setting up and using Redux may not be worth the benefits. In these cases, the use of local state and context API may be sufficient. I personally started using Zustand, a tiny (2.5KB) state management library for React that is inspired by Redux. Like Redux, Zustand provides a centralized store for storing the state of your application, making it easy to share data between components. However, unlike Redux, Zustand is designed to be much simpler to use, with a smaller API and less boilerplate code.

In Zustand, you define your store using a state hook, which returns an array of state and a setter function for updating the state. You can then use the state in your components and update it using the setter function. For example:

import { useState } from 'zustand';

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

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

Zustand also supports advanced features like derived state, middleware, and memoization, making it a powerful alternative to Redux for small to medium-sized projects.

Whether or not Zustand is right for your project depends on your specific needs and constraints. If you're looking for a simple and lightweight state management solution, Zustand is definitely worth considering.

Ultimately, regardless if Redux was over-hyped only depends on the individual developer's experience and the specific requirements of their project. Some developers may find it to be an indispensable tool, while others may feel that it is overkill.

Top comments (0)