The React Context API allows you to share global state across your component tree without having to pass props down manually at every level. It is especially useful when dealing with deeply nested components or managing data that needs to be accessible throughout an entire app, such as themes, user authentication, or preferences.
React Context API
1. Creating a Context
To create a context in React, you can use the createContext
function. This will give you a Provider
and a Consumer
component, which are used to pass and consume data.
import React, { createContext, useState } from 'react';
// Create a Context
const MyContext = createContext();
function App() {
const [state, setState] = useState('Hello, world!');
return (
<MyContext.Provider value={{ state, setState }}>
<Child />
</MyContext.Provider>
);
}
function Child() {
return (
<MyContext.Consumer>
{({ state, setState }) => (
<div>
<h2>{state}</h2>
<button onClick={() => setState('Hello, React!')}>Change Text</button>
</div>
)}
</MyContext.Consumer>
);
}
export default App;
In this example, we create a context called MyContext
using createContext()
. The App
component provides the context value, and the Child
component consumes the context using the MyContext.Consumer
.
2. Using useContext Hook
Instead of using the Consumer
component, React provides the useContext
hook, which allows you to directly access the context value in a functional component:
import React, { createContext, useState, useContext } from 'react';
// Create a Context
const MyContext = createContext();
function App() {
const [state, setState] = useState('Hello, world!');
return (
<MyContext.Provider value={{ state, setState }}>
<Child />
</MyContext.Provider>
);
}
function Child() {
const { state, setState } = useContext(MyContext);
return (
<div>
<h2>{state}</h2>
<button onClick={() => setState('Hello, React!')}>Change Text</button>
</div>
);
}
export default App;
In this updated example, we replace the MyContext.Consumer
with the useContext
hook. This allows the Child
component to consume the context value directly.
3. Updating Context Values
You can update context values from any component within the context provider. Here's an example where the state is updated through the setState
function:
import React, { createContext, useState, useContext } from 'react';
// Create a Context
const MyContext = createContext();
function App() {
const [state, setState] = useState('Hello, world!');
return (
<MyContext.Provider value={{ state, setState }}>
<Child />
<AnotherChild />
</MyContext.Provider>
);
}
function Child() {
const { state, setState } = useContext(MyContext);
return (
<div>
<h2>{state}</h2>
<button onClick={() => setState('Changed from Child!')}>Change Text</button>
</div>
);
}
function AnotherChild() {
const { state } = useContext(MyContext);
return <h2>{state}</h2>;
}
export default App;
In this example, the setState
function is used in one component (Child) to update the global state, and this update is automatically reflected in other components (AnotherChild) that consume the context.
4. Default Context Values
You can provide default values to the context to avoid undefined values if the context is consumed without a provider:
import React, { createContext, useState, useContext } from 'react';
// Create a Context with default values
const MyContext = createContext({ state: 'Default State', setState: () => {} });
function App() {
const [state, setState] = useState('Hello, world!');
return (
<MyContext.Provider value={{ state, setState }}>
<Child />
</MyContext.Provider>
);
}
function Child() {
const { state, setState } = useContext(MyContext);
return (
<div>
<h2>{state}</h2>
<button onClick={() => setState('Changed from Child!')}>Change Text</button>
</div>
);
}
export default App;
Here, we provide a default value to the context using createContext
, which ensures that the context has a fallback value if no Provider
is found.
5. Summary
The React Context API provides a way to share state across your component tree without needing to pass props manually. It helps avoid prop drilling and makes managing global state in your React application much easier. You can use createContext
to create a context, and useContext
or Consumer
to consume the context in your components. Context can also be updated and passed down the component tree.
Note: We aim to make learning easier by sharing top-quality tutorials, but please remember that tutorials may not be 100% accurate, as occasional mistakes can happen. Once you've mastered the language, we highly recommend consulting the official documentation to stay updated with the latest changes. If you spot any errors, please feel free to report them to help us improve.