Hello there, Welcome!
If you’ve ever built a React app and found yourself tired of passing data from one component to another and then another... you’re not alone! This is called prop drilling, and it’s one of the most common hurdles developers face — especially in growing projects.
But worry not! React’s Context API is here to the rescue. It helps you share data like user info, themes, or language settings across your app — without all that prop-passing chaos.
In this guide, we’ll explore what the Context API is, why it’s useful, and how to use it with practical examples.
🚀 What is Context API?
The Context API is a built-in feature in React that allows data to be shared across the component tree without explicitly passing props at every level.
It’s like a global state manager for simple use cases like:
- Authentication (user login/logout)
- Theme switching (light/dark)
- Language/Localization
- Modal visibility
🔧 When Should You Use It?
Context is great when:
- You have state that needs to be accessed by many components.
- You want to avoid deeply nested prop passing.
But it’s not ideal for:
- High-frequency updates (e.g., input fields) — it can cause unnecessary re-renders.
- Complex state management — for that, use Zustand or Redux.
🛠️ How to Use the Context API
Let’s build an Auth context step-by-step to manage user login state.
Step 1: Create Context
import { createContext, useContext, useState } from "react";
const AuthContext = createContext();
Now that we've created our AuthContext,
When we call createContext, it returns an object with two parts:
Provider: Used to wrap our component tree and pass down values (like user, login, etc.) to all children.
Consumer: Used to access those values in older/class components (less common now).
In modern React (with hooks), we usually combine Provider with the useContext hook for simpler and cleaner access to context values. Consumer is mostly used in older React code or class components.
Step 2: Create a Provider Component
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null);
const login = (userData) => setUser(userData);
const logout = () => setUser(null);
return (
<AuthContext.Provider value={{ user, login, logout }}>
{children}
</AuthContext.Provider>
);
};
Step 3: Create a Custom Hook
export const useAuth = () => useContext(AuthContext);
This makes it easier to consume the context in any component:
When we call useAuth, It will automatically return AuthContext data.
const { user, login, logout } = useAuth();
🧪 Wrapping Your App
In main.jsx
or _app.js
(depending on your setup), wrap your app in the AuthProvider
:
import { AuthProvider } from "./contexts/AuthContext";
const Root = () => (
<AuthProvider>
<App />
</AuthProvider>
);
Now all components inside <App />
can access the auth context.
🧩 Real World Example
import { useAuth } from "./contexts/AuthContext";
const Dashboard = () => {
const { user, login, logout } = useAuth();
const handleLogin = ()=> {
const userName = prompt("Please enter your name");
login(userName);
}
return user ? (
<>
<p>Welcome, {user.name}</p>
<button onClick={logout}>Logout</button>
</>
) : (
<button onClick={handleLogin}>Login</button>
);
};
✅ Best Practices
- ✅ Split contexts logically (e.g., AuthContext, ThemeContext).
- ✅ Use custom hooks for clean context consumption.
- ✅ Keep context value minimal (avoid putting huge data inside).
- ❌ Don’t use context for frequently updating values.
🏁 Conclusion
The Context API is a powerful tool when used right. For things like auth, theme, and global UI state, it's a clean, scalable way to manage state in your React app without external libraries.
Use it wisely — and when your app starts growing, consider combining it with local state or moving to more advanced state managers like Zustand or Redux.
Happy coding! 💻✨
Top comments (4)
Love how you broke this down with real code. Do you ever pair Context with something like Zustand for more complex apps?
Thanks man! I haven’t paired both yet—usually used either one depending on the need. Have you tried combining them in your projects? Appreciate the idea!
Nice work, I actually get Context API now
Thanks Nathan!