Considerations
- This is an introductory article and presents a way to use the React Context.
- It is important that you consult the references to better understand the concepts and when it is useful to use them.
- Using the context API requires at least basic React knowledge (creating reusable components, state manipulation, props...).
What is the Context API?
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.
But what does it mean?
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.
How to use?
For better understanding you can access the code on CodeSandbox
In the example below we will have:
- A file containing the entire Context Api configuration
- How to retrieve data typed in input into different components
- Two components that will be updated with the values entered in the input
Creating User Context
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 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.
Wrapping the App component with the created context
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.
Using name and lastName data
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:
nameComponent.js
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;
lastNameComponent.js
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.
Updating context data
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
.
Conclusion
In this article, we use React Context to create global variables and use them in components without having to use props.
Top comments (1)
Thanks for this nicely explained :)