The Context API helps share data easily across many parts of your app without passing props step-by-step.
Context API in React Native
import React, { createContext, useState, useContext } from 'react'; const MyContext = createContext(); function MyProvider({ children }) { const [value, setValue] = useState(null); return ( <MyContext.Provider value={{ value, setValue }}> {children} </MyContext.Provider> ); } function MyComponent() { const context = useContext(MyContext); // use context.value or context.setValue }
createContext makes a new context object.
Provider wraps components to share data.
const ThemeContext = createContext('light');function ThemeProvider({ children }) {
const [theme, setTheme] = useState('dark');
return <ThemeContext.Provider value={{ theme, setTheme }}>{children}</ThemeContext.Provider>;
}import { Text } from 'react-native'; function DisplayTheme() { const { theme } = useContext(ThemeContext); return <Text>Current theme is {theme}</Text>; }
This app uses Context API to share a counter value and update functions across components without passing props. The CounterProvider wraps the app and provides the count state. CounterDisplay shows the current count. CounterButtons has buttons to increase or decrease the count.
import React, { createContext, useState, useContext } from 'react'; import { Text, View, Button } from 'react-native'; const CounterContext = createContext(); function CounterProvider({ children }) { const [count, setCount] = useState(0); return ( <CounterContext.Provider value={{ count, setCount }}> {children} </CounterContext.Provider> ); } function CounterDisplay() { const { count } = useContext(CounterContext); return <Text>Count: {count}</Text>; } function CounterButtons() { const { setCount } = useContext(CounterContext); return ( <View> <Button title="Increase" onPress={() => setCount(c => c + 1)} /> <Button title="Decrease" onPress={() => setCount(c => c - 1)} /> </View> ); } export default function App() { return ( <CounterProvider> <View style={{ padding: 20 }}> <CounterDisplay /> <CounterButtons /> </View> </CounterProvider> ); }
Always wrap components that use context inside the Provider.
Context is great for global data but avoid overusing it for local states.
Use descriptive names for your context to keep code clear.
Context API shares data easily across many components.
Use createContext, Provider, and useContext together.
It helps avoid passing props through many layers.
Practice
Context API?Solution
Step 1: Understand Context API's role
Context API is designed to share data globally in a React app without passing props through every level.Step 2: Compare options
Only To share data easily across many components without passing props manually describes this purpose. Others relate to styling, navigation, or data fetching, which are unrelated.Final Answer:
To share data easily across many components without passing props manually -> Option AQuick Check:
Context API = Share data easily [OK]
- Confusing Context API with styling or navigation
- Thinking it fetches data from servers
- Believing it replaces all props usage
Solution
Step 1: Recall correct syntax for creating context
React Native uses React.createContext() to create a new context object.Step 2: Analyze options
const MyContext = React.createContext(); uses the full correct syntax. const MyContext = createContext(); misses React prefix. new Context(); uses invalid constructor. React.useContext(); calls useContext which is a hook, not for creation.Final Answer:
const MyContext = React.createContext(); -> Option CQuick Check:
Create context = React.createContext() [OK]
- Omitting React prefix
- Using new Context() which doesn't exist
- Confusing useContext hook with createContext
ChildComponent?
const MyContext = React.createContext('Default');
function Parent() {
return (
);
}
function ChildComponent() {
const value = React.useContext(MyContext);
return {value};
}Solution
Step 1: Identify the Provider value
The sets the value to "Hello" for all children inside it.Step 2: Check useContext usage in ChildComponent
ChildComponent uses React.useContext(MyContext) which reads the nearest Provider's value, which is "Hello".Final Answer:
Hello -> Option DQuick Check:
useContext reads Provider value = Hello [OK]
- Thinking default value is used when Provider exists
- Assuming undefined if value is string
- Confusing error with missing Provider
const MyContext = React.createContext();
function Parent() {
return (
);
}
function Child() {
const value = React.useContext();
return {value};
}Solution
Step 1: Check useContext call in Child
useContext must be called with the context object as argument, e.g., React.useContext(MyContext).Step 2: Verify other parts
Provider has a value prop "Hi" which is correct. createContext can be called without initial value (undefined default). Child can use useContext.Final Answer:
useContext is called without passing the context object -> Option BQuick Check:
useContext needs context argument [OK]
- Calling useContext() with no arguments
- Thinking createContext must have initial value
- Believing Provider can omit value prop
React.createContext(), wrap components with Provider passing user as value, use useContext in children.
B) Pass user as props to every component manually.
C) Use useState in every component to store user.
D) Use React.createContext() but do not wrap components with Provider.Solution
Step 1: Identify correct Context API usage
To share data globally, create context, wrap components with Provider passing data, and consume with useContext.Step 2: Eliminate incorrect options
B passes props manually, not using Context API. C duplicates state unnecessarily. D creates context but no Provider means default or undefined value.Final Answer:
Create context, wrap with Provider passing user, use useContext in children -> Option AQuick Check:
Context API = create + Provider + useContext [OK]
- Skipping Provider wrapping
- Passing props manually instead of using context
- Using useState in every component unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
