Skip to content

Creating a Custom React Context Provider

Updated: at 02:12 PM

Creating a Custom React Context Provider

Hello React enthusiasts! Today we’re going to go on a coding adventure to create a reusable custom context provider. By the end of this journey, you’ll have a fully functional Next.js app with a context provider managing a list of delicious cookies. We’ll also include a search feature to look for your favorite cookies.

Let’s dive in!

Step 1: Setting Up Your Project

The first thing we need is a new Next.js project. To create one, open your terminal and type the following:

npx create-next-app@13 --typescript

This command will create a new Next.js project with TypeScript. Navigate into your new project:

cd your_project_name

Step 2: Creating Our Context

Context in React provides a way to pass data through the component tree without having to pass props down manually at every level.

Let’s create a new file called CookieContext.tsx in a folder named context at the root of our project.

Inside CookieContext.tsx, let’s create and export our context:

import { createContext, useContext } from "react";

interface CookieContextInterface {
  cookies: string[];
  searchValue: string;
  setSearchValue: (value: string) => void;
}

const CookieContext = createContext<CookieContextInterface | undefined>(undefined);

export const useCookieContext = () => {
  const context = useContext(CookieContext);
  if (context === undefined) {
    throw new Error("useCookieContext must be used within a CookieProvider");
  }
  return context;
};

export default CookieContext;

In this file, we’re importing createContext and useContext from React. We’re creating a context for our cookies and a search value. We’re also creating a custom hook useCookieContext that we will use to access our context.

Step 3: Creating the Context Provider

Next, we’ll create the context provider in the same CookieContext.tsx file. The provider will wrap our components, making the context available to them.

Add the following code to CookieContext.tsx:

import { useState } from "react";

export const CookieProvider: React.FC = ({ children }) => {
  const [cookies, setCookies] = useState<string[]>(["Chocolate Chip", "Sugar", "Oatmeal", "Gingerbread"]);
  const [searchValue, setSearchValue] = useState<string>("");

  return (
    <CookieContext.Provider value={{ cookies, searchValue, setSearchValue }}>
      {children}
    </CookieContext.Provider>
  );
};

Here, we’re importing the useState hook from React. useState is a Hook that lets you add React state to function components. We’re using it to manage our cookies list and the search value.

Step 4: Using the Provider

Now let’s use our CookieProvider to wrap our app. Open _app.tsx and import the CookieProvider:

import { CookieProvider } from "../context/CookieContext";

Then, wrap the Component with CookieProvider:

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <CookieProvider>
      <Component {...pageProps} />
    </CookieProvider>
  );
}

export default MyApp;

Step 5: Using the Context (Continued)

We can now use our context in any component within our app. Let’s create a CookieList component which will list our cookies and include a search feature.

Create a new file called CookieList.tsx in a folder named components at the root of our project.

Let’s import React and our custom context hook useCookieContext:

import React from 'react';
import { useCookieContext } from '../context/CookieContext';

Then, let’s create a functional component that uses our context:

const CookieList: React.FC = () => {
  const { cookies, searchValue, setSearchValue } = useCookieContext();

  const filteredCookies = cookies.filter((cookie) =>
    cookie.toLowerCase().includes(searchValue.toLowerCase())
  );

  return (
    <div>
      <input
        type="text"
        value={searchValue}
        onChange={(e) => setSearchValue(e.target.value)}
        placeholder="Search for a cookie..."
      />
      <ul>
        {filteredCookies.map((cookie, index) => (
          <li key={index}>{cookie}</li>
        ))}
      </ul>
    </div>
  );
};

export default CookieList;

In this component, we’re accessing the cookies, the search value, and the function to set the search value from our context. We’re filtering the cookies based on the search value and rendering them in a list. We’re also creating an input field that sets the search value when it’s changed.

Finally, to see our CookieList component in action, let’s import it into our index.tsx file:

import React from 'react';
import CookieList from '../components/CookieList';

const Home: React.FC = () => (
  <div>
    <h1>Welcome to the Cookie Shop!</h1>
    <CookieList />
  </div>
);

export default Home;

That’s it! If you run npm run dev in the terminal and go to http://localhost:3000 in your browser, you should see a list of cookies and a search box. As you type into the search box, the list of cookies will update to match your search.

In this tutorial, we’ve learned how to create a custom context provider in a Next.js app using TypeScript. This approach provides a neat and reusable way to share and manage state across your React components. Happy coding!

Check out the ORM (Object Relational Mapper) PRISMA. The database access method I use in all my projects