Implementing a global loading spinner for API requests in a React application involves intercepting API requests and responses to manage the loading state globally. You can achieve this by creating an HTTP interceptor using Axios, a popular HTTP client, combined with React context and state management. Here's a basic example of how you can implement a global loading spinner:
Set up Axios with Interceptors:
First, set up Axios with request and response interceptors to manage the loading state globally. Install Axios if you haven't already:
bashnpm install axios
Then, create a file (e.g., axiosInstance.js
) to configure Axios:
javascriptimport axios from 'axios';
const axiosInstance = axios.create();
// Request interceptor
axiosInstance.interceptors.request.use((config) => {
// Set loading to true or show loading spinner
// You can dispatch an action to set loading state globally here
return config;
}, (error) => {
return Promise.reject(error);
});
// Response interceptor
axiosInstance.interceptors.response.use((response) => {
// Set loading to false or hide loading spinner
// You can dispatch an action to set loading state globally here
return response;
}, (error) => {
// Set loading to false or hide loading spinner
// You can dispatch an action to set loading state globally here
return Promise.reject(error);
});
export default axiosInstance;
Use React Context for Loading State:
Create a React context to manage the loading state globally. Create a file (e.g., LoadingContext.js
):
javascriptimport React, { createContext, useState } from 'react';
export const LoadingContext = createContext();
export const LoadingProvider = ({ children }) => {
const [loading, setLoading] = useState(false);
return (
<LoadingContext.Provider value={{ loading, setLoading }}>
{children}
</LoadingContext.Provider>
);
};
Wrap Your App with the Loading Provider:
Wrap your application with the LoadingProvider
to make the loading state available to all components:
javascriptimport React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { LoadingProvider } from './LoadingContext';
ReactDOM.render(
<React.StrictMode>
<LoadingProvider>
<App />
</LoadingProvider>
</React.StrictMode>,
document.getElementById('root')
);
Use the Loading Context in Your Components:
In your components, you can use the LoadingContext
to access the loading state and conditionally render a loading spinner:
javascriptimport React, { useContext } from 'react';
import { LoadingContext } from './LoadingContext';
const MyComponent = () => {
const { loading } = useContext(LoadingContext);
return (
<div>
{loading && <div>Loading...</div>}
{/* Your component content */}
</div>
);
};
export default MyComponent;
With this setup, Axios interceptors manage the loading state globally by setting it to true before making a request and setting it to false after receiving a response or encountering an error. The loading state is then made available to all components using React context, allowing you to conditionally render a loading spinner wherever needed.