Type something to search...
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.

Terminal window
# 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
Terminal window
# select the react
? Select a framework: react
Terminal window
# select the javascript
? Select a variant: javascript

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

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

Step 2: Go to the project directory

Terminal window
cd react-with-redux-toolkit

Step 3: Install Basic Dependencies

Terminal window
# using npm
npm install
# using yarn
yarn install
# using pnpm
pnpm install

Step 4: Install Redux Toolkit

Terminal window
# 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.

Terminal window
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.

Terminal window
# 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.

src/App.jsx
const App = () => {
return (
<div>
<p>React With Redux Toolkit - Part 1</p>
</div>
);
};
export default App;

Step 2.3: Create the main.jsx file

We will create the main.jsx file.

src/main.jsx
import React, {StrictMode} from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
ReactDOM.createRoot(document.getElementById('root')).render(
<StrictMode>
<App />
</StrictMode>,
);

Step 3: Create the Store

Step 3.1: Create the store.js file

We will create the store.js file.

src/app/store.js
import {configureStore} from '@reduxjs/toolkit';
const store = configureStore({
reducer: {},
});
export default store;

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

Note: We will add the reducer later.

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

src/main.jsx
import React, {StrictMode} from 'react';
import ReactDOM from 'react-dom/client';
import {Provider} from 'react-redux';
import App from './App';
import store from './app/store';
ReactDOM.createRoot(document.getElementById('root')).render(
<StrictMode>
<Provider store={store}>
<App />
</Provider>
</StrictMode>,
);

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
  • <Provider store={store}> - pass the store to the Provider component

Step 4: Create the counterSlice.js file

We will create the counterSlice.js file.

src/components/Counter/counterSlice.js
import {createSlice} from '@reduxjs/toolkit';
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;
},
},
});
export const {increment, decrement, reset, incrementByAmount} =
counterSlice.actions;
export default counterSlice.reducer;

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.

src/app/store.js
import {configureStore} from '@reduxjs/toolkit';
import counterReducer from '../components/Counter/counterSlice';
const store = configureStore({
reducer: {
counter: counterReducer,
},
});
export default store;

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.

src/components/Counter/Counter.jsx
import React from 'react';
import {useSelector, useDispatch} from 'react-redux';
import {increment, decrement, reset, incrementByAmount} from './counterSlice';
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>
);
};
export default Counter;

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.

src/App.jsx
import React from 'react';
import Counter from './components/Counter/Counter';
const App = () => (
<div>
<Counter />
</div>
);
export default App;

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
  • <Counter /> - add the Counter Component to the App Component

Step 8: Run the application

We will run the application.

Terminal window
yarn dev

Redux Toolkit Counter

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.

src/components/Header/Header.jsx
import React from 'react';
import {useSelector} from 'react-redux';
const Header = () => {
const count = useSelector((state) => state.counter.count);
return (
<header>
<h1>Redux Toolkit Counter</h1>
<p>Count: {count}</p>
</header>
);
};
export default 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.

src/App.jsx
import React from 'react';
import Header from './components/Header/Header';
import Counter from './components/Counter/Counter';
const App = () => (
<div>
<Header />
<Counter />
</div>
);
export default App;

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
  • <Header /> - add the Header Component to the App Component

Step 11: Run the application

We will run the application.

Terminal window
yarn dev

Redux Toolkit Counter with Header

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. You can clone the repository and run the application.

Terminal window
# 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

Related Posts

Check out some of our other posts

Setup Nextjs Tailwind CSS Styled Components with TypeScript

Setup Nextjs Tailwind CSS Styled Components with TypeScript

Introduction In this post, we will setup Nextjs Tailwind CSS Styled Components with TypeScript, and we will use the following tools:Nextjs Tailwind CSS Styled Components TypeScript

read more
Building a Customizable Image Slider in React Using Hooks, SCSS, and TypeScript

Building a Customizable Image Slider in React Using Hooks, SCSS, and TypeScript

Introduction In this tutorial, we will be building a customizable image slider in React using hooks, SCSS, and TypeScript. An image slider is a common UI element used in web applications to displ

read more
Unlocking the Power of React Context API: Demystifying State Management

Unlocking the Power of React Context API: Demystifying State Management

Introduction In the ever-evolving realm of web development, the effective management of application state is a pivotal aspect that can either elevate or hinder your project's success. In this con

read more