---
title: "React With Redux Toolkit"
description: "In this post, we will learn how to use Redux Toolkit to manage the state of our React application."
author: "Mohammad Abu Mattar"
canonical: https://mkabumattar.com/blog/post/react-with-redux-toolkit
---

# React With Redux Toolkit

## Prerequisites

This post assumes that you have a basic understanding of React and Redux. and it will be better if you have some experience with React Hooks like `useReducer`.

## Introduction

Nowadays, we have a lot of state management libraries for React, such as Redux, MobX, and Recoil. In this post, we will learn how to use Redux Toolkit to manage the state of our React application.

### What is Redux?

Redux is a predictable state container for JavaScript apps. It helps you write applications that behave consistently, run in different environments (client, server, and native), and are easy to test. On top of that, it provides a great developer experience, such as live code editing combined with a time traveling debugger.

### What is Redux Toolkit?

Redux Toolkit is the official, opinionated, batteries-included toolset for efficient Redux development. It is intended to be the standard way to write Redux logic.

It was originally created to help address three common concerns about Redux:

- Configuring a Redux store is too complicated.
- I have to add a lot of packages to get Redux to do anything useful.
- Redux requires too much boilerplate code.

### Why Redux Toolkit?

Redux Toolkit is a package that contains a set of tools to help you write Redux logic more easily. It is not a Redux replacement, but it is an alternative to writing Redux logic by hand.

## Installation

### Step 1: Initialize a React project using vite

First, we need to initialize a React project using vite.

```shell
# using npm
npm init vite react-with-redux-toolkit

# using yarn
yarn create vite react-with-redux-toolkit

# using pnpm
pnpm create vite react-with-redux-toolkit

# using npx
npx create-vite react-with-redux-toolkit
```

```shell
# select the react
? Select a framework: react
```

```shell
# select the javascript
? Select a variant: javascript
```

<br />

  You can use `npm`, `yarn`, `pnpm`, or `npx` to initialize a React project
  using vite.

  You can use `typescript` instead of `javascript` to initialize a React project
  using vite.

### Step 2: Go to the project directory

```shell
cd react-with-redux-toolkit
```

### Step 3: Install Basic Dependencies

```shell
# using npm
npm install

# using yarn
yarn install

# using pnpm
pnpm install
```

### Step 4: Install Redux Toolkit

```shell
# using npm
npm install @reduxjs/toolkit react-redux

# using yarn
yarn add @reduxjs/toolkit react-redux

# using pnpm
pnpm add @reduxjs/toolkit react-redux
```

## Usage

### Step 1: Remove the unnecessary files

We will remove the unnecessary files, or we can say that we will clean up `src` directory.

```shell
rm -rf src/*
```

Explanation:

- `rm` - remove files or directories
- `-rf` - remove directories and their contents recursively

### Step 2: Create the Basic Structure

#### Step 2.1: Create the Folders and Files

We will create the basic structure of our project.

```shell
# create the components directory
mkdir src/components

# create the store directory
mkdir src/app

# create the App.jsx file
touch src/App.jsx

# create the main.jsx file
touch src/main.jsx
```

#### Step 2.2: Create the `App.jsx` file

We will create the `App.jsx` file.

```jsx title="src/App.jsx" del={3-5}
const App = () => {
  return (
    <div>
      <p>React With Redux Toolkit - Part 1</p>
    </div>
  );
};

```

#### Step 2.3: Create the `main.jsx` file

We will create the `main.jsx` file.

```jsx title="src/main.jsx"

ReactDOM.createRoot(document.getElementById('root')).render(

  ,
);
```

### Step 3: Create the Store

#### Step 3.1: Create the `store.js` file

We will create the `store.js` file.

```jsx title="src/app/store.js"

const store = configureStore({
  reducer: {},
});

```

As you can see, we have imported the `configureStore` function from `@reduxjs/toolkit` and we have created the store using the `configureStore` function.

Explanation:

- `import { configureStore } from '@reduxjs/toolkit'` - import the configureStore function
- `const store = configureStore({ reducer: {} })` - create the store using the configureStore function
- `export default store` - export the store

We will add the reducer later.

After that we will do some changes to the main.jsx file.

```jsx title="src/main.jsx" ins={3-5} ins={9-11}

ReactDOM.createRoot(document.getElementById('root')).render(

  ,
);
```

You'll notice that we have wrapped the App component with the `Provider` component after importing it from the `react-redux` library. Additionally, the store from `./app/store` was imported. To the `Provider` component, we have passed the `store`.

Explanation:

- `import { Provider } from 'react-redux'` - import the Provider component
- `import store from './app/store'` - import the store
- `` - pass the store to the Provider component

### Step 4: Create the `counterSlice.js` file

We will create the `counterSlice.js` file.

```jsx title="src/components/Counter/counterSlice.js"

const initialState = {
  count: 0,
};

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

  counterSlice.actions;

```

The `createSlice` function is used to create a slice of the store. We have passed the name of the slice as `counter`. We have passed the initial state of the slice as `initialState`. We have passed the reducers as an object. We have passed the `increment`, `decrement`, `reset`, and `incrementByAmount` reducers. We have exported the `increment`, `decrement`, and `incrementByAmount` actions. We have exported the reducer.

Explanation:

- `import { createSlice } from '@reduxjs/toolkit'` - import the createSlice function
- `const initialState = { count: 0 }` - define the initial state of the slice
- `const counterSlice = createSlice({ name: 'counter', initialState, reducers: { increment: (state) => { state.count += 1 }, decrement: (state) => { state.count -= 1 }, reset: (state) => { state.count = 0 }, incrementByAmount: (state, action) => { state.count += action.payload }, } })` - create the slice of the store
- `export const { increment, decrement, reset, incrementByAmount } = counterSlice.actions` - export the actions
- `export default counterSlice.reducer` - export the reducer

### Step 5: Add the `counterSlice` reducer to the store

We will add the `counterSlice` reducer to the store.

```jsx title="src/app/store.js" ins={2} ins={6}

const store = configureStore({
  reducer: {
    counter: counterReducer,
  },
});

```

Now after adding the `counterSlice` reducer to the store, it will be available in the entire application.

Explanation:

- `import counterReducer from '../components/Counter/counterSlice'` - import the counterSlice reducer
- `reducer: { counter: counterReducer }` - add the counterSlice reducer to the store

### Step 6: Add the Counter Component to the App Component

We will add the Counter Component to the App Component.

```jsx title="src/components/Counter/Counter.jsx"

const Counter = () => {
  const count = useSelector((state) => state.counter.count);
  const dispatch = useDispatch();

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => dispatch(increment())}>Increment</button>
      <button onClick={() => dispatch(decrement())}>Decrement</button>
      <button onClick={() => dispatch(reset())}>Reset</button>
      <button onClick={() => dispatch(incrementByAmount(5))}>
        Increment By 5
      </button>
    </div>
  );
};

```

As you can see, we have imported the `useSelector` hook from `react-redux`. We have imported the `useDispatch` hook from `react-redux`. We have imported the `increment`, `decrement`, `reset`, and `incrementByAmount` actions from `./counterSlice`. We have used the `useSelector` hook to get the count from the store. We have used the `useDispatch` hook to dispatch the actions. We have used the `increment`, `decrement`, `reset`, and `incrementByAmount` actions to dispatch the actions.

Explanation:

- `import { useSelector, useDispatch } from 'react-redux'` - import the useSelector hook and the useDispatch hook
- `import { increment, decrement, incrementByAmount } from './counterSlice'` - import the actions
- `const count = useSelector((state) => state.counter.count)` - get the count from the store
- `const dispatch = useDispatch()` - get the dispatch function
- `onClick={() => dispatch(increment())}` - dispatch the increment action
- `onClick={() => dispatch(decrement())}` - dispatch the decrement action
- `onClick={() => dispatch(reset())}` - dispatch the reset action
- `onClick={() => dispatch(incrementByAmount(5))}` - dispatch the incrementByAmount action

### Step 7: Add the Counter Component to the App Component

We will add the Counter Component to the App Component.

```jsx title="src/App.jsx" ins={2} ins={6}

const App = () => (
  <div>

  </div>
);

```

As you can see, we have imported the Counter Component. We have added the Counter Component to the App Component.

Explanation:

- `import Counter from './components/Counter/Counter'` - import the Counter Component
- `` - add the Counter Component to the App Component

### Step 8: Run the application

We will run the application.

```shell
yarn dev
```

![Redux Toolkit Counter](/assets/blog/0029-react-with-redux-toolkit/redux-toolkit-counter.png)

As you can see, we have a counter. We can increment the counter. We can decrement the counter. We can increment the counter by 5.

### Step 9: Access `count` value in other components

We will access the `count` value in other components, for example, in the `Header` component.

```jsx title="src/components/Header/Header.jsx"

const Header = () => {
  const count = useSelector((state) => state.counter.count);

  return (
    <header>
      <h1>Redux Toolkit Counter</h1>
      <p>Count: {count}</p>
    </header>
  );
};

```

As you can see, we have imported the `useSelector` hook from `react-redux`. We have used the `useSelector` hook to get the `count` value from the store. We have added the `count` value to the `Header` component.

Explanation:

- `import { useSelector } from 'react-redux'` - import the useSelector hook
- `const count = useSelector((state) => state.counter.count)` - get the count from the store
- `<p>Count: {count}</p>` - add the count to the Header component

### Step 10: Add the Header Component to the App Component

We will add the Header Component to the App Component.

```jsx title="src/App.jsx" ins={3} ins={8}

const App = () => (
  <div>

  </div>
);

```

As you can see, we have imported the Header Component. We have added the Header Component to the App Component.

Explanation:

- `import Header from './components/Header/Header'` - import the Header Component
- `` - add the Header Component to the App Component

### Step 11: Run the application

We will run the application.

```shell
yarn dev
```

![Redux Toolkit Counter with Header](/assets/blog/0029-react-with-redux-toolkit/redux-toolkit-counter-with-header.png)

As you can see, we have a counter. We can increment the counter. We can decrement the counter. We can increment the counter by 5. We have a header with the count value.

## Source Code

You can find the source code for this tutorial on [GitHub](https://github.com/MKAbuMattar/react-with-redux-toolkit). You can clone the repository and run the application.

```shell
# Clone the repository
git clone https://github.com/MKAbuMattar/react-with-redux-toolkit.git

# Go inside the directory
cd react-with-redux-toolkit

# Install dependencies
yarn install

# Run the application
yarn dev
```

## Conclusion

In this article, we learned how to establish a Redux store using the Redux Toolkit. A Redux slice can now be made, as we have learned. We now know how to take an action. We now know how to build reducers. We now know how to build a Redux store. The Redux store may now be added to the App Component, as we learned how to do. We now know how to add the Counter Component to the App Component. Accessing the `count` value in other components is something we now know how to do. We have learned how to add the Header Component to the App Component.

## Resources

- [Redux Toolkit Official Website](https://redux-toolkit.js.org/)
- [Redux Toolkit Quick Start Tutorial](https://redux-toolkit.js.org/tutorials/quick-start)
- [Redux Official Website](https://redux.js.org/)
- [React Official Website](https://reactjs.org/)
- [React Redux Documentation](https://react-redux.js.org/)
- [Vite Official Website](https://vitejs.dev/)
- [Redux Toolkit `configureStore` API Reference](https://redux-toolkit.js.org/api/configureStore)
- [Redux Toolkit `createSlice` API Reference](https://redux-toolkit.js.org/api/createSlice)
- [Using Redux with React Hooks (`useSelector`, `useDispatch`)](https://react-redux.js.org/api/hooks)
- [Redux DevTools Extension](https://github.com/reduxjs/redux-devtools)
- [Redux Core Concepts](https://redux.js.org/understanding/thinking-in-redux/three-principles)
- [React Context (Alternative for simple state management)](https://reactjs.org/docs/context.html)
- [GitHub Repository for this tutorial](https://github.com/MKAbuMattar/react-with-redux-toolkit)
