Post

React Fundamentals: A Modern Guide - Part 3: Context API and Advanced State

React Fundamentals: A Modern Guide - Part 3: Context API and Advanced State

Introduction

In the previous parts of this series, we covered components, props, and the core hooks useState and useEffect. While these tools are sufficient for many applications, they can lead to “prop drilling”—the process of passing data through multiple layers of components that don’t need it. The Context API solves this by providing a way to share values between components without explicitly passing a prop through every level of the tree.

Understanding the Problem: Prop Drilling

Imagine a user profile component that needs to access a theme or user object. If your component structure is App -> Layout -> Header -> UserProfile, you would have to pass the user prop down through every single layer.

The Context API

Context provides a way to share data like this across the component tree without manually passing props.

1. Creating the Context

First, create a context object.

1
2
3
import { createContext } from "react";

export const UserContext = createContext(null);

2. Providing the Context

Use the context Provider to wrap the components that need access to the data.

1
2
3
4
5
6
7
8
9
10
11
import { UserContext } from "./UserContext";

function App() {
  const user = { name: "Alice", role: "admin" };

  return (
    <UserContext.Provider value={user}>
      <Layout />
    </UserContext.Provider>
  );
}

3. Consuming the Context

Use the useContext hook to access the context value in any child component.

1
2
3
4
5
6
7
8
9
10
11
12
import { useContext } from "react";
import { UserContext } from "./UserContext";

function UserProfile() {
  const user = useContext(UserContext);

  return (
    <div>
      User: {user.name} ({user.role})
    </div>
  );
}

When to Use Context

Context is not a silver bullet. Use it sparingly, as it makes component reusability more difficult. It is ideal for “global” data like:

  • Theme (dark/light mode)
  • Authenticated user data
  • Language settings

For managing complex local state that doesn’t need to be global, stick to useState or consider useReducer for complex state logic within a single component.

Conclusion

The Context API is a powerful tool for avoiding prop drilling and sharing global state efficiently. Combined with the hooks we learned earlier, you have a robust toolkit for building scalable, maintainable React applications.

Suggested Reading

This post is licensed under CC BY 4.0 by the author.