How to Use React Context for State Management in Next.js 13

  • How to Use React Context for State Management in Next.js 13

Next.js offers several approaches to state management. While a few of these techniques call for setting up brand-new libraries, React's Context API is integrated, so it's a terrific means of decreasing exterior dependences.

With React Context, you can flawlessly pass data with different parts of your part tree, eliminating the problem of prop exploration. This is specifically valuable for handling international state like the present customer's logged-in standing or their preferred style.

Understanding React Context API

Prior to diving right into the code, it is very important to comprehend what React Context API is and also what trouble it resolves.

Props give an effective method for sharing information between parts. They enable you to pass information from a moms and dad element to its child components.

Due to the fact that it plainly reveals which parts make use of specific information and also how that information flows down the part tree, this approach is beneficial.

Understanding React Context API

Troubles arise when you have deeply nested elements that require to take in the very same props. This scenario can introduce complexities as well as possibly lead to convoluted code that is more challenging to keep. These problems, to name a few, are the drawbacks of prop exploration.

React Context resolves this difficulty by providing a centralized technique to develop and use data that needs to be accessible globally, throughout elements.

It sets up a context to hold this information, allowing components to access it. This approach helps you structure your codebase to guarantee it's well-organized.

Beginning With State Management in Next.js 13 Making Use Of React Context API

Next.js Server Components enable you to develop applications that make the best of both worlds: the interactivity of client-side apps and also the efficiency benefits of web server rendering.

Next.js 13 executes Server Parts in the app directory-- which is currently stable-- by default. However, because all elements are server-rendered, you may face problems when incorporating client-side collections or APIs such as React Context.

To avoid this, a terrific workaround is the use client flag that you can set on files that will certainly run client-side code.

To begin, create a Next.js 13 project in your area by running this command in your terminal:

npx create-next-app@latest next-context-api

After creating the job, browse to its directory site:

cd next-context-api


Start the advancement server:

npm run dev

You can build a fundamental to-do app that utilizes React Context API for state management as soon as you have actually set up a fundamental Next.js job.

Create the Context Provider

The context carrier documents functions as a central hub where you define and also manage the international state that parts require to gain access to.

Develop a new file, src/context/Todo. context.js, as well as populate it with the adhering to code.

"use client"

import React, { createContext, useReducer } from "react";

const initialState = {
  todos: [],

const reducer = (state, action) => {
  switch (action.type) {
    case "ADD_TODO":
      return { ...state, todos: [...state.todos, action.payload] };

    case "DELETE_TODO":
      return { ...state, todos: state.todos.filter((todo, index) => 
               index !== action.payload) };

    case "EDIT_TODO":
      const updatedTodos =, index) => 
               index === action.payload.index ? action.payload.newTodo : todo);
      return { ...state, todos: updatedTodos };

      return state;

export const TodoContext = createContext({
  state: initialState,
  dispatch: () => null,

export const TodoContextProvider = ({ children }) => {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (

This React Context arrangement specifies a TodoContext which originally holds the state of an empty to-do list for the application.

Aside from creating the preliminary state, this context configuration includes a reducer function that defines various action kinds. These action types will certainly customize the context's state depending upon the triggered actions. In this instance, the actions consist of adding, removing, and also editing to-dos.

The TodoContextProvider part gives the TodoContext to other elements in the application. This part takes 2 props: the value prop, which is the initial state of the context, as well as the reducer prop, which is the reducer function.

When an element takes in the TodoContext, it can access the state of the context as well as dispatch activities to upgrade the state.

Add the Context Provider to the Next.js Application

Now, to make certain that the context provider provides at the origin of your Next.js application, and that all customer elements can access it, you require to include the context to the app's origin design element.

To do this, open the src/app/layout.js data as well as cover the kids node in the HTML template with the context carrier as follows:

import './globals.css';
import { TodoContextProvider } from "@/context/Todo.context";

export const metadata = {
  title: "Create Next App",
  description: "Generated by create next app",

export default function RootLayout({
}) {
  return (


Develop a To-Do Part

Develop a brand-new data, src/components/Todo. js, as well as include the complying with code to it.

Start by making the following imports. Ensure to include the use customer flag to mark this component as a client-side component.

"use client"

import { TodoContext } from "@/context/Todo.context";
import React, { useContext, useState } from "react";

Next, define the functional element, including the JSX components that will provide on the web browser.


export default function Todo() {
  return (


setTodoText(} style={{ marginBottom: 16}} placeholder="Enter a todo" />
    {, index) => (
  • {index === editingIndex ? ( <> setEditedTodo(} /> ) : ( <> {todo} )}
  • ))}
); }

This functional element consists of input fields to include, modify, and also remove to-dos, along with corresponding buttons. It utilizes React's conditional rendering to show the edit and remove buttons based upon the editing and enhancing index worth.

Specify the required state variables and also the needed trainer features for each activity type. Inside the function component, add the following code.


const { state, dispatch } = useContext(TodoContext);
  const [todoText, setTodoText] = useState("");
  const [editingIndex, setEditingIndex] = useState(-1);
  const [editedTodo, setEditedTodo] = useState("");

  const handleAddTodo = () => {
    if (todoText.trim() !== "") {
      dispatch({ type: "ADD_TODO", payload: todoText });

  const handleDeleteTodo = (index) => {
    dispatch({ type: "DELETE_TODO", payload: index });

  const handleEditTodo = (index, newTodo) => {
    dispatch({ type: "EDIT_TODO", payload: { index, newTodo } });


These handler features are in charge of handling the addition, deletion, as well as editing of a customer's to-dos within the context's state.

They make sure that when a user adds, deletes, or modifies a to-do, the ideal actions are sent off to the context's reducer to upgrade the state as necessary.

Make the To-Do Element

Finally, import the To-do part right into the page part.

To do that, open up the page.js file in the src/app directory, erase the boilerplate Next.js code, as well as include the code below:


import styles from './page.module.css'
import Todo from '../components/Todo'

export default function Home() {
  return (
) }

Excellent! Now, you must have the ability to manage the state in the To-do Next.js application utilizing React Context.

Using React Context API With Various Other State Management Technologies

The React Context API is a terrific solution for state management. It's feasible to utilize it alongside various other state management collections like Redux. This hybrid technique ensures you utilize the very best tool for different parts of your application that carry out crucial duties.

By doing so, you can profit from the benefits of various state management remedies to develop effective and maintainable applications.



Related Articles

How to Install the Java JDK in Windows 11

How to Install the Java JDK in Windows 11. JDK is a development environment required to build Java applications. Learn how to install and run the JDK on Windows 11.

10 Crucial Performance Tips for Visual Studio Code

10 Crucial Performance Tips for Visual Studio Code. Visual Studio Code strikes other programming text editors out of the water.

How to Change DNS on Ubuntu Server?

How to Change DNS on Ubuntu Server? Changing the DNS server in Ubuntu can actually increase your network speed and eliminate internet problems in Linux.

Python vs. Java: The Best Language for 2023

Python vs. Java: The Best Language for 2023. Unsure about the programming language you should learn? The only option if you want to start coding in 2023 is this.