React context lets you share data easily between components without passing props down many levels. It helps keep your app organized and clean.
React context in client components in NextJS
import React, { createContext, useContext, useState } from 'react'; const MyContext = createContext(); function MyProvider({ children }) { const [state, setState] = useState(); return ( <MyContext.Provider value={{ state, setState }}> {children} </MyContext.Provider> ); } function MyComponent() { const context = useContext(MyContext); // use context.state or context.setState }
createContext makes a new context object.
Provider wraps components that need access to the shared data.
const ThemeContext = createContext('light'); function ThemeProvider({ children }) { const [theme, setTheme] = useState('light'); return <ThemeContext.Provider value={{ theme, setTheme }}>{children}</ThemeContext.Provider>; } function Button() { const { theme } = useContext(ThemeContext); return <button>{`Current theme is ${theme}`}</button>; }
const UserContext = createContext(null); function UserProvider({ children }) { const [user, setUser] = useState(null); return <UserContext.Provider value={{ user, setUser }}>{children}</UserContext.Provider>; } function Profile() { const { user } = useContext(UserContext); return <div>{user ? `Hello, ${user.name}` : 'Not logged in'}</div>; }
This is a simple counter app using React context. The count state is shared through context. The button increases the count, and the updated count shows immediately.
import React, { createContext, useContext, useState } from 'react'; const CountContext = createContext(0); function CountProvider({ children }) { const [count, setCount] = useState(0); return ( <CountContext.Provider value={{ count, setCount }}> {children} </CountContext.Provider> ); } function Counter() { const { count, setCount } = useContext(CountContext); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increase</button> </div> ); } export default function App() { return ( <CountProvider> <Counter /> </CountProvider> ); }
Always wrap components that use context inside the matching Provider.
Context is great for global or app-wide data, but avoid overusing it for local state.
In Next.js client components, use 'use client' directive at the top if needed.
React context shares data easily without passing props everywhere.
Use a Provider to wrap components that need the shared data.
Access context data inside components with useContext hook.
Practice
Solution
Step 1: Understand React context role
React context allows sharing data across components without manually passing props at every level.Step 2: Compare with other options
Creating HTML elements, styling, and event handling are unrelated to React context's main purpose.Final Answer:
To share data easily without passing props through every component -> Option AQuick Check:
React context = data sharing without prop drilling [OK]
- Confusing context with styling or event handling
- Thinking context creates HTML elements
- Believing context is for CSS only
Solution
Step 1: Identify the hook for context access
React provides the useContext hook to access context values inside client components.Step 2: Eliminate other hooks
useState manages state, useEffect handles side effects, and useRef manages references, none access context.Final Answer:
const value = useContext(MyContext); -> Option CQuick Check:
useContext hook = context access [OK]
- Using useState or useEffect instead of useContext
- Trying to access context without a hook
- Confusing useRef with context access
import { createContext, useContext } from 'react';
const ThemeContext = createContext('light');
export default function DisplayTheme() {
const theme = useContext(ThemeContext);
return <div>Current theme: {theme}</div>;
}What will be displayed if
DisplayTheme is rendered without a ThemeContext.Provider?Solution
Step 1: Check default context value
The context is created with default value 'light', so if no Provider wraps the component, this default is used.Step 2: Understand useContext behavior without Provider
useContext returns the default value when no Provider is found above in the tree.Final Answer:
Current theme: light -> Option BQuick Check:
Default context value used without Provider [OK]
- Expecting undefined or null instead of default value
- Thinking it throws an error without Provider
- Confusing default value with null
import { createContext, useContext } from 'react';
const UserContext = createContext();
export default function UserName() {
const user = useContext(UserContext);
return <div>User: {user.name}</div>;
}Solution
Step 1: Check context default value and Provider usage
UserContext is created without a default value and no Provider is shown wrapping UserName, so useContext returns undefined.Step 2: Understand error cause
Accessing user.name when user is undefined causes a runtime error.Final Answer:
UserContext is not wrapped with a Provider, so user is undefined causing error -> Option AQuick Check:
Undefined context value causes error accessing properties [OK]
- Assuming useContext needs a string argument
- Forgetting to wrap with Provider
- Thinking React import is mandatory in Next.js 13+ client components
Solution
Step 1: Understand state sharing with context
To update theme globally, context must provide state and a function to toggle it, so all components share and update the same state.Step 2: Evaluate other options
Fixed string cannot update dynamically; separate useState per component does not share state; passing props everywhere defeats context purpose.Final Answer:
Create a ThemeContext with state and provide toggle function via Provider; use useContext to read and update theme -> Option DQuick Check:
Context with state and updater shares dynamic data [OK]
- Trying to update fixed context value directly
- Using separate state in each component without sharing
- Passing props everywhere instead of using context
Ready to prove it?
Pass the test and this pattern moves unknown
