Skip to content

Redux - Overview

Redux is a predictable state container for JavaScript applications. It helps you manage the global state of your application in a predictable way, making applications easier to understand, debug, and scale.

As applications grow, managing state shared across many components can become complex. Passing data through multiple layers of components (prop drilling) or using local component state for everything can lead to inconsistencies and difficulties in tracking data flow. Redux addresses this by centralizing the application’s state in a single ‘store’ and enforcing strict rules for how that state can be updated.

While Redux can be used with any UI layer (React, Angular, Vue, Svelte, or even vanilla JavaScript), it’s most commonly associated with React. The core concepts, however, are universal.

  • Predictable State Management: Changes to the state follow strict rules, making the application’s behavior easier to reason about.
  • Centralized State: All global application state lives in one place (the store), simplifying access and management.
  • Debugging: Tools like Redux DevTools allow time-travel debugging, action inspection, and state comparison.
  • Maintainability: Clear separation of concerns (state logic vs. UI logic) makes code easier to maintain and test.
  • Community & Ecosystem: A large ecosystem of addons, middleware, and community support is available.

Redux operates on three fundamental principles:

The entire global state of your application is stored in a single JavaScript object tree within a single store. This makes it easy to inspect the state, persist it, or hydrate it for server rendering.

The only way to change the state is by dispatching an action, which is a plain JavaScript object describing what happened. You cannot directly modify the state object. This ensures that state changes are intentional and traceable.

To specify how the state tree is transformed by actions, you write pure reducers. Reducers are functions that take the previous state and an action, and return the next state. They must be pure – meaning they produce the same output for the same input and have no side effects (like API calls or modifying the original state).

While understanding these core principles is essential, writing Redux code manually can involve significant boilerplate (action type constants, action creators, switch statements in reducers, store configuration). The official recommendation is to use Redux Toolkit (@reduxjs/toolkit), which simplifies common Redux tasks, reduces boilerplate, and enforces best practices.

Throughout this tutorial, we will emphasize the modern approach using Redux Toolkit while still explaining the underlying Redux concepts it builds upon.