useContext #
useContext
#
const value = useContext(MyContext);
Accepts a context object (the value returned from React.createContext) and returns the current context value for that context. The current context value is determined by the value prop of the nearest <MyContext.Provider> above the calling component in the tree.
When the nearest <MyContext.Provider> above the component updates, this Hook will trigger a rerender with the latest context value passed to that MyContext provider. Even if an ancestor uses
React.memo or
shouldComponentUpdate, a rerender will still happen starting at the component itself using useContext.
Don’t forget that the argument to useContext must be the context object itself:
- Correct:
useContext(MyContext) - Incorrect:
useContext(MyContext.Consumer) - Incorrect:
useContext(MyContext.Provider)
A component calling useContext will always re-render when the context value changes. If re-rendering the component is expensive, you can
optimize it by using memoization.
Tip
If you’re familiar with the context API before Hooks,
useContext(MyContext)is equivalent tostatic contextType = MyContextin a class, or to<MyContext.Consumer>.
useContext(MyContext)only lets you read the context and subscribe to its changes. You still need a<MyContext.Provider>above in the tree to provide the value for this context.
Putting it together with Context.Provider
const themes = {
light: {
foreground: "#000000",
background: "#eeeeee"
},
dark: {
foreground: "#ffffff",
background: "#222222"
}
};
const ThemeContext = React.createContext(themes.light);
function App() {
return (
<ThemeContext.Provider value={themes.dark}>
<Toolbar />
</ThemeContext.Provider>
);
}
function Toolbar(props) {
return (
<div>
<ThemedButton />
</div>
);
}
function ThemedButton() {
const theme = useContext(ThemeContext);
return (
<button style={{ background: theme.background, color: theme.foreground }}>
I am styled by theme context!
</button>
);
}
This example is modified for hooks from a previous example in the Context Advanced Guide, where you can find more information about when and how to use Context.