---
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 helps 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 the 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 and clean up the `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 make 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. We also imported the store from `./app/store`. Then we passed that `store` to the `Provider` component.

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 passed the name of the slice as `counter` and the initial state as `initialState`. We passed the reducers as an object, holding `increment`, `decrement`, `reset`, and `incrementByAmount`. Then we exported the `increment`, `decrement`, `reset`, and `incrementByAmount` actions, and the reducer itself.

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: create the Counter component

We will create the Counter 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` and `useDispatch` hooks from `react-redux`, and the `increment`, `decrement`, `reset`, and `incrementByAmount` actions from `./counterSlice`. We use `useSelector` to get the count from the store, and `useDispatch` to dispatch the actions. Each button dispatches one of those four actions.

Explanation:

- `import { useSelector, useDispatch } from 'react-redux'` - import the useSelector hook and the useDispatch hook
- `import { increment, decrement, reset, 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 and added it 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 it, decrement it, reset it, and increment it by 5.

### Step 9: access the `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 use it to get the `count` value from the store, and then render that value inside 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 and added it 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, decrement, reset, and increment by 5. We also have a header showing the same 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 set up a Redux store with Redux Toolkit. We created a Redux slice, wrote the actions and the reducers, and built the store from them. We added that store to the App component through the `Provider`. We added the Counter component to the App component, read the `count` value from a second component, and added the Header component to the App component as well.

## 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)
