Prop drilling means passing data through many layers of components just to reach the one that needs it. Avoiding it makes your code cleaner and easier to manage.
Avoiding prop drilling in React
import React, { createContext, useContext, useState } from 'react'; const MyContext = createContext(); function Parent() { const [value, setValue] = useState('Hello'); return ( <MyContext.Provider value={{ value, setValue }}> <Child /> </MyContext.Provider> ); } function Child() { const { value, setValue } = useContext(MyContext); return ( <div> <p>{value}</p> <button onClick={() => setValue('Hi!')}>Change</button> </div> ); }
createContext creates a context object to hold shared data.
useContext lets components access the shared data without passing props.
import React, { createContext, useContext } from 'react'; const ThemeContext = createContext('light'); function App() { return ( <ThemeContext.Provider value="dark"> <Toolbar /> </ThemeContext.Provider> ); } function Toolbar() { return <ThemeButton />; } function ThemeButton() { const theme = useContext(ThemeContext); return <button>{theme}</button>; }
import React, { createContext, useContext } from 'react'; const UserContext = createContext(null); function App() { const user = { name: 'Anna' }; return ( <UserContext.Provider value={user}> <Profile /> </UserContext.Provider> ); } function Profile() { const user = useContext(UserContext); return <h1>Hello, {user.name}</h1>; }
This React app shares the language state across components without passing props through Page. Header shows the current language, and Content has buttons to change it.
import React, { createContext, useContext, useState } from 'react'; const LanguageContext = createContext(); function App() { const [language, setLanguage] = useState('English'); return ( <LanguageContext.Provider value={{ language, setLanguage }}> <Page /> </LanguageContext.Provider> ); } function Page() { return ( <div> <Header /> <Content /> </div> ); } function Header() { const { language } = useContext(LanguageContext); return <h1>Current Language: {language}</h1>; } function Content() { const { setLanguage } = useContext(LanguageContext); return ( <div> <button onClick={() => setLanguage('Spanish')}>Spanish</button> <button onClick={() => setLanguage('French')}>French</button> </div> ); } export default App;
Context is great for avoiding prop drilling but avoid overusing it for every small piece of data.
Remember to wrap components that need shared data inside the Provider.
Using context makes your app easier to maintain and understand.
Prop drilling means passing props through many layers unnecessarily.
React Context helps share data directly to components that need it.
Use createContext and useContext to avoid prop drilling and keep code clean.
Practice
prop drilling causes in React applications?Solution
Step 1: Understand what prop drilling means
Prop drilling happens when props are passed down through many components that don't use them, just to reach a deeply nested component.Step 2: Identify the main issue caused by prop drilling
This makes the code harder to maintain and understand because many components receive props they don't need.Final Answer:
Passing props through many layers even if intermediate components don't need them -> Option DQuick Check:
Prop drilling = Passing props through many layers [OK]
- Confusing prop drilling with state management issues
- Thinking prop drilling is about rendering performance
- Believing prop drilling is caused by hooks misuse
Solution
Step 1: Recall the React API for creating context
React providescreateContextto create a context object for sharing data.Step 2: Identify the correct syntax
The correct syntax isconst MyContext = React.createContext();. The other options are hooks used for different purposes.Final Answer:
const MyContext = React.createContext(); -> Option BQuick Check:
createContext() creates context [OK]
- Using useContext() to create context instead of consume it
- Confusing useState() or useEffect() with context creation
- Missing parentheses after createContext
Child component?const MyContext = React.createContext('default');
function Parent() {
return (
);
}
function Child() {
const value = React.useContext(MyContext);
return <div>{value}</div>;
}Solution
Step 1: Understand the context default and provider value
The context default is 'default', but theParentcomponent provides the value 'hello' viaMyContext.Provider.Step 2: Determine what useContext returns inside Child
TheChildcomponent usesuseContext(MyContext), so it receives the nearest provider's value, which is 'hello'.Final Answer:
<div>hello</div> -> Option AQuick Check:
useContext returns nearest Provider value [OK]
- Assuming default value is always used
- Thinking useContext returns undefined without explicit value
- Confusing Provider value with component props
const MyContext = React.createContext();
function Parent() {
const value = 'data';
return <Child />;
}
function Child() {
const value = React.useContext(MyContext);
return <div>{value}</div>;
}Solution
Step 1: Check if Provider wraps components needing context
TheParentcomponent returns<Child />without wrapping it inMyContext.Provider.Step 2: Understand useContext requires Provider to get value
Without a Provider,useContext(MyContext)returns the default value, which is undefined here, likely not intended.Final Answer:
MyContext.Provider is missing around Child component -> Option AQuick Check:
Provider missing = context value undefined [OK]
- Thinking createContext must have default value
- Believing useContext works without Provider
- Confusing prop passing with context usage
ThemeContext provides a theme string. You want to avoid prop drilling and also allow components to update the theme. Which approach correctly combines context and state to achieve this?Solution
Step 1: Understand how to share state and updater via context
To avoid prop drilling and allow updates, the context should provide both the current value and a function to update it.Step 2: Use createContext and provide state and setter from top-level
Create a context withcreateContext(), then in a top-level component useuseStateto hold theme and pass boththemeandsetThemein the Provider's value.Step 3: Consume both theme and setTheme in nested components
Nested components useuseContextto get both and can read or update the theme without prop drilling.Final Answer:
Create ThemeContext with createContext, provide {theme, setTheme} from a state in a top-level component, and consume both in nested components -> Option CQuick Check:
Context with state and setter avoids prop drilling [OK]
- Passing only value without setter in context
- Using global variables instead of React state
- Passing props through many layers instead of context
Ready to prove it?
Pass the test and this pattern moves unknown
