Reading Time: 2 minutes
Hello, today we are going to learn how to add a context in React Native to reuse components across multiple screens without repeating the component.
The first thing we need to do is create our component, in this case, it’s a loader:
Folder: components/loader.js
import React from "react"; import { View, StyleSheet } from "react-native"; import { ActivityIndicator } from 'react-native-paper'; const Loader = () => { return ( <View style={[styles.container]}> <ActivityIndicator animating={true} size="large" color="#235589" /> </View> ); }; export default Loader; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: "center", alignItems: "center", position: "absolute", top: 0, left: 0, right: 0, bottom: 0, width: "100%", height: "100%", } });
This adds a loader using the React Native Paper library.
We need to import it:
npm install --save react-native-paper
Now let’s create the context folder and add the global_context.js file:
import React, { createContext, useState, useEffect, useContext, useRef } from 'react' // Create the context export const ServiceContext = createContext() export const ServiceProvider = ({ children }) => { // For the loader const [isLoading, setIsloading] = useState(false) return ( <ServiceContext.Provider value={{ isLoading, setIsloading }}> {children} </ServiceContext.Provider> ) }
We have created a ServiceContext and a ServiceProvider that provide us with the isLoading and setIsloading methods as state variables.
Now let’s go to our APP.js and add the useContext import to add the created context:
import React, { useContext } from "react";
Now let’s import our context:
import { ServiceContext, ServiceProvider } from './context/global_context';
We set it as a context, and inside the render, we add this line:
const App = () => { const { isLoading, setIsloading } = useContext(ServiceContext) ...
And now we add the element, in this case, it’s a loader:
... </Stack.Navigator> { isLoading && <Loader /> } </NavigationContainer> ...
In my case, I add it after the Stack Navigator.
And in the export, we add:
export default function App() { return ( <ServiceProvider> <App /> </ServiceProvider> ); }
This way, we return both the ServiceProvider and the APP.
If we want to use this loader in different screens, we need to perform these imports:
- Add the useContext:
import React, { useContext } from "react";
- Import the context we are going to use:
import { ServiceContext, ServiceProvider } from './context/global_context';
- Import the exported methods from global_context that we are going to use (imported in the render):
const App = () => { const { isLoading, setIsloading } = useContext(ServiceContext)
And now we can use the loader:
setIsloading(true);
(excluding the Reading Time). Return it directly in HTML format. Do not add any additional sentences. When you finish, add a PIPE at the end.