二次封装axios,请求加载进度条

一、利用npm 官网的nprogress
// axios 的二次封装
import axios from 'axios'
//下面可以是任意插件 我们以进度条为例 二次封装一个请求过程中自动出现进度条的案例
import Nprogress from 'nprogress'
import "nprogress/nprogress.css"

// 刚刚发起请求的时候先拦截一下
// 必须在拦截器中return config
axios.interceptors.request.use((config) => {
	//进度条开启
    Nprogress.start()
    // config 是请求前配置的内容
    return config
})

// 响应结果后拦截一下
axios.interceptors.response.use((data) => {
	//进度条关闭
    Nprogress.done()
    //data 是返回的请求结果 如果自定义输入 请求返回就为自定义值
    return data
})

export default axios
二、使用element ui 的loading 组件,添加请求接口的loading 效果  vue2

.安装element-ui; 打开官网 : https://element.eleme.cn/2.13/#/zh-CN/component/installation

 安装 npm i element-ui -S  按需引入 npm install babel-plugin-component -D

按照官网步骤来

  项目的根目录下面添加.balelrc文件,在文件内添加下面的代码

  {

  "plugins":[

    [

      "component",

      {

        "libraryName": "element-ui",

        "styleLibraryName": "theme-chalk"

      }

    ]

  ]

}

import axios from "axios";
import { Loading } from 'element-ui';
import router from '../router/index.js'
const instance = axios.create({
    baseURL: '',
    timeout: 5000,
  });

  let loadingInstance =null;
  // 添加请求拦截器
  instance.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    loadingInstance = Loading.service({
        text:'正在加载中。。。。。'
    });
  const token=localStorage.getItem('token');
  if(token){
    config.headers.Authorization='Bearer '+token;
  }
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么?
    loadingInstance?.close();
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    loadingInstance?.close();
    const status=error.response.status;
    if(status==404){
    router.push('/qwer',()=>{},()=>{});
      return error.response
    }
    if(status==401){
      alert('token已失效或者是token被篡改了')
      router.push('/login',()=>{},()=>{});
      return error.response;
    }
    return Promise.reject(error);
  });
  export default instance
三、在vue3中,咱们使用的是element-plus组件库

1、下载安装组件库,并在组件库中找到loadding这个组件

 npm install element-plus --save

2、在封装的axios中引入,并结合axios使用

import axios from 'axios';
import { ElLoading } from 'element-plus'

const loadingInstance = () => {
    const options = {
        lock: true,           //
        text: "加载中。。。。",  //加载图标下方的加载文案
        background: 'rgba(0,0,0,0.7)'  //遮罩背景色
    }
    ElLoading.service(options)
}
const endLoading = () => {
    loadingInstance.close()
}
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    //开始加载
    loadingInstance()
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    //关闭loading
    endLoading()
    return response;
  }, function (error) {
    // 对响应错误做点什么
    //关闭loading 
    endLoading()
    return Promise.reject(error);
  });


export default  axios


四、当有多个请求,如何关闭loading效果;

import axios from 'axios';

// 创建 Loading 状态管理对象
const loadingStates = {
  loading1: false,
  loading2: false,
  // 可以根据需要添加更多的 loading 状态
};

// 创建 Axios 实例
const instance = axios.create({
  baseURL: 'https://api.example.com',
});

// 添加请求拦截器,在发送请求之前显示对应的 loading
instance.interceptors.request.use(config => {
  // 根据请求的特征决定显示哪个 loading
  if (config.url.includes('/endpoint1')) {
    loadingStates.loading1 = true;
  } else if (config.url.includes('/endpoint2')) {
    loadingStates.loading2 = true;
  }
  return config;
}, error => {
  return Promise.reject(error);
});

// 添加响应拦截器,在请求完成后隐藏对应的 loading
instance.interceptors.response.use(response => {
  // 根据响应的特征决定隐藏哪个 loading
  if (response.config.url.includes('/endpoint1')) {
    loadingStates.loading1 = false;
  } else if (response.config.url.includes('/endpoint2')) {
    loadingStates.loading2 = false;
  }
  return response;
}, error => {
  // 在请求出错时也要隐藏 loading
  loadingStates.loading1 = false;
  loadingStates.loading2 = false;
  return Promise.reject(error);
});

// 导出封装后的 Axios 实例
export default instance;
四、当有多个网络请求时,如何处理loading效果
import { ElLoading } from 'element-plus';

let loadingCount = 0;
let loadingInstance;
const showLoading = (target) => {
    if (loadingCount === 0) {
        loadingInstance = ElLoading.service({ target });
    }
    loadingCount++;
}
const hideLoading = () => {
    if (loadingCount <= 0) return
    loadingCount--
    if (loadingCount === 0) {
        loadingInstance.close()
    }
}

export {
    showLoading,
    hideLoading
}
//导入axios
import axios from 'axios';
//导入loading加载效果
import { showLoading, hideLoading } from './loading.js';
import { ElMessage } from 'element-plus'
//创建实例
const instance = axios.create({
  timeout: 2000,
});

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  //打开loading效果
  showLoading()
  //断网提示
  if (!navigator.onLine) {
    ElMessage({
      message: '你的网络出现了故障!',
      type: 'warning',
    })
  }
  // 在发送请求之前做些什么
  let token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = 'Beaeer ' + token;
  }
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use(function (response) {

  setTimeout(() => {
    hideLoading()
  }, 1000)

  // 对响应数据做点什么
  return response;
}, function (error) {
  // 对响应错误做点什么
  let code = error.response.status;
  switch (code) {
    case 400:
      console.log('语法错误');
      break;
    case 401:
      console.log('未授权');
      localStorage.removeItem('token');
      router.push('/login')
      break;
    case 404:
      console.log('未找到');
      break;
    case 500:
      console.log('服务器错误');
      break;
    case 502:
      console.log('网关错误');
      break;
  }

  return Promise.reject(error);
});

export default instance

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值