36
Introduction to React Context - How to use it simply
If we access the React Context documentation we will have the following definition:
Context provides a way to pass data through the component tree without having to pass props down manually at every level.
Basically we have the following - Context provides a way to pass data between components without having to manually pass through all levels.
Data in React is usually passed to components via props, from parent to child. If you have components that are nested in a more complex way, it can be tricky to deal with this data passing between components. And that's where the Context API comes in. Simply, instead of accessing, for example, a state directly from the component or passing through props, you can now access that same state globally.
For better understanding you can access the code on CodeSandbox
In the example below we will have:
In the context file is where we create a global variable that can be accessed in every application. The context provider is used to involve a parent component and each child that exists in the application.
For this we will create the
useContext.js
file, which is where the context instance and the variables to be used will be created.In
useContext.js
, create the context object by importing and using createContext
import React, { createContext, useState } from "react";
export const MyContext = createContext();
export const UserProvider = ({ children }) => {
const [name, setName] = useState("");
const [lastName, setLastName] = useState("");
return (
<MyContext.Provider
value={{
name,
setName,
lastName,
setLastName
}}
>
{children}
</MyContext.Provider>
);
};
Above we export the
These data/variables are passed through the provider's
MyContext
that will be used in the child components. useState
to maintain the state of the Name
and lastName
variables, with their corresponding methods.These data/variables are passed through the provider's
value
. The provider serves to provide context to child components.The
index.js
file is imported from the UserProvider
context file useContext.js
. So we're going to wrap the <App/>
with the UserProvider
like this:import ReactDOM from "react-dom";
import { UserProvider } from './useContext';
import App from "./App";
const rootElement = document.getElementById("root");
ReactDOM.render(
<UserProvider>
<App />
</UserProvider>,
rootElement
);
From that moment on, all the data passed in
value
in our context file can be accessed in other components.To use the first and last name data, two components were created
ComponentName.js
and ComponentLastName.js
. In both files it is necessary to import the MyContext
from our context file and the useContext
hook that will be used to set the context that we will use to access the available data. Staying like this:import React, { useContext } from "react";
import { MyContext } from "./useContext";
const Name = () => {
const user = useContext(MyContext);
return (
<div>
<h2>
<strong>Name</strong>: {user.name}
</h2>
</div>
);
};
export default Name;
import React, { useContext } from "react";
import { MyContext } from "./useContext";
const LastName = () => {
const user = useContext(MyContext);
return (
<div>
<h2>
<strong>Last Name</strong>: {user.lastName}
</h2>
</div>
);
};
export default LastName;
Note that, in both components, the code was used:
const user = useContext(MyContext);
The
user
const will be responsible so that we can access the global variables of our context.In the
App.js
file, we import the MyContext
and using the useContext
hook we will consume the data from our context. With the setName
and setLastName
methods retrieved from the context, we call onChange
on the respective inputs so that the data is updated with each character typed by the user. Staying like this:import React, { useContext } from "react";
import { MyContext } from "./useContext";
import Name from "./ComponentName";
import LastName from "./ComponentLastName";
import "./styles.css";
export default function App() {
const user = useContext(MyContext);
return (
<div className="App">
<div>
<div>
<label className="label">Name: </label>
<input
onChange={(event) =>
user.setName(event.target.value)} />
</div>
<div>
<label>Last Name: </label>
<input
onChange={(event) =>
user.setLastName(event.target.value)}
/>
</div>
</div>
<Name />
<LastName />
</div>
);
}
Thus, every time a change is detected in one of the inputs, it will trigger the corresponding method, which changes the value in the context, thus updating the information in
ComponentName.js
and ComponentName.js
.In this article, we use React Context to create global variables and use them in components without having to use props.
36