useReducer Hook in React

useReducer Hook in React

ยท

4 min read

Welcome back again!

This is the fifth blog in the React Hook series, where we're learning about different hooks used in React, and today's hook is the useReducer hook. Before we get started, I'd recommend reading the last blogs of this series React Hooks. Though this hook is entirely independent of we can read and learn it without any prior knowledge of hooks, it would be beneficial to have some basic understanding of the hooks.

What is useReducer Hook

To handle the complex state in our application, we use the useReducer hook. It is the same as the useState hook, but instead, it is used to handle the states where we have to keep track of the complex states which rely on the complex logic.

Syntax:

useReducer(reducerFn, initialState )

  • reducerFn is the function that contains the logic to handle the manipulation of our state.
  • initialState is the initial state value of our state. It is primarily objects while using the useReducer.

useReducer hooks return the two values:

const [ state, dispatch ] = useReducer ( reducerFn, initialState )

  • the state is the value of the current state
  • dispatch is the method that will be used to call our reducerFn.

Understand useReducer by Example

In the following example, we will create a simple app that will display the user's Name and Account Number. We will be using useReducer for this.

Step 1 => Import the useReducer Hook

Import the useReducer hook and define it in the component.

import React, { useReducer } from "react";

const UseReducer = () => {
  const [userData, dispatchData] = useReducer(userReducer, {
    userName: "Please Login!",
    userAccount: null
  });
};

Here userData will be our value of the state then, and the initial value of the state will be an object with properties userName and userAccount. dispatchData will be the method to call the userReducer function, which we will define in the coming section.

Step 2 => Define userReducer function:

We can define the userReducer function outside our component since all the values will be passed using the dispatchData method.

// Reducer function

const userReducer = (state, action) => {
  if (action.type === "LOGIN") {
    return {
      userName: action.data.name,
      userAccount: action.data.account
    };
  }
  if (action.type === "LOGGED_OUT") {
    return {
      userName: "You are logged out!",
      userAccount: null
    };
  }
};

The userReducer function will take two arguments state and action. state is the value of the state then, and action is used to check for what action which if condition to render, and this type will be passed by the dispatchData method that we will define in the coming section.

Step 3 => Add the UI for the Application

We will create the UI for the application that will show the userName and userAccount numbers along with two buttons. One of them is to handle the login function and will call the loginHandler function once clicked, and the other button will handle the logoutHandler function. Here is how the code for the UI will look like:

return (
    <div className="component">
      <p>{userData.userName}</p>
      <p>{userData.userAccount}</p>
      <div className="btns">
        <button onClick={loginHandler}>Login</button>
        <button onClick={logoutHandler}>Logout</button>
      </div>
    </div>
  );

Step 4 => Define the loginHandler and logoutHandler functions

loginHandler and logoutHandler functions will use the dispatchData method to pass the object with property type and user details. The type will have the value LOGIN and which we will use in our userReducer function to call the specific if statement according to the value of the type.

// Login Handler
  const loginHandler = () => {
    dispatchData({
      type: "LOGIN",
      data: {
        name: "Hello Vansh Sharma",
        account: "Your account number is: 123456"
      }
    });
  };

  // Logout Handler
  const logoutHandler = () => {
    dispatchData({
      type: "LOGOUT"
    });
  };

Combining the above all code snippets in the following codesandbox we get the following application:

Check the UseReducer.js to understand more.

When to use useReducer

As you can see the, setting up useReducer is more lengthy than using the useState hook; therefore prefer using the useReducer only if the state of the component depends on the complex function or the state of the component is complicated, like an object with many properties.

That's all for this blog. Continue reading this React hook series to learn more about React hooks. In the next blog, we'll look at the Custom hook . Feel free to leave your valuable feedback in the comments below.

To learn more about React, JavaScript, and Web development, follow me on :

Reference: W3Schools

Did you find this article valuable?

Support webtalks by becoming a sponsor. Any amount is appreciated!

ย