Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add global loading/spin effect in axios interceptor for a React project

I am use axios for API call in a React project, and I want to add a loading or spinning effect globally in between a api call's request and response in my axios interceptor, here is the code of my interceptor.

import Axios from 'axios'

Axios.interceptors.request.use(function (config) {
  // spinning start to show
  const token = window.localStorage.token;
  if (token) {
     config.headers.Authorization = `token ${token}`
  }
  return config
}, function (error) {
  return Promise.reject(error);
});

Axios.interceptors.response.use(function (response) {
  // spinning hide
  return response;
}, function (error) {
  return Promise.reject(error);
});
like image 225
Liao Zhuodi Avatar asked Aug 10 '18 03:08

Liao Zhuodi


People also ask

How do I add interceptor to Axios?

Setting up Axios interceptorsCreate a new Axios instance with a custom config. Create request, response & error handlers. Configure/make use of request & response interceptors from Axios. Export the newly created Axios instance to be used in different locations.

How do you get Axios response data in React?

First, you import React and Axios so that both can be used in the component. Then you hook into the componentDidMount lifecycle hook and perform a GET request. You use axios. get(url) with a URL from an API endpoint to get a promise which returns a response object.


1 Answers

Perhaps you could take a simpler approach, where you display a full-screen loading message while your app is busy loading data via axios?

For example, you could make the following additions to your code/project to show a global "loading message" on screen while during axio requests:

CSS:

/* Define css class for global loading message to cover 
   screen during axios operations */

.loading-indicator:before {
    content: '';
    background: #000000cc;
    position: fixed;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    z-index: 1000;
}

.loading-indicator:after {
    content: 'Loading';
    position: fixed;
    width: 100%;
    top: 50%;
    left: 0;
    z-index: 1001;
    color:white;
    text-align:center;
    font-weight:bold;
    font-size:1.5rem;        
}

Javascript:

Axios.interceptors.request.use(function (config) {

  // spinning start to show
  // UPDATE: Add this code to show global loading indicator
  document.body.classList.add('loading-indicator');

  const token = window.localStorage.token;
  if (token) {
     config.headers.Authorization = `token ${token}`
  }
  return config
}, function (error) {
  return Promise.reject(error);
});

Axios.interceptors.response.use(function (response) {

  // spinning hide
  // UPDATE: Add this code to hide global loading indicator
  document.body.classList.remove('loading-indicator');

  return response;
}, function (error) {
  return Promise.reject(error);
});

Using this method, you could even use CSS3 animations to replace the "loading" message with a animated spinner, or something similar - hope this helps!

like image 98
Dacre Denny Avatar answered Nov 03 '22 21:11

Dacre Denny