axios 拦截器使用方法

新创建一个文件夹例如utils,创建request文件里面写下如下代码

import axios from 'axios';

//1. 创建axios对象
const service = axios.create(
    {
        baseURL:'你的接口跟路径',
        timeout:5000

    }
);

//2. 请求拦截器
service.interceptors.request.use(config => {
  return config;
}, error => {
  Promise.reject(error);
});

//3. 响应拦截器
service.interceptors.response.use(response => {
  //判断code码
  return response.data;
},error => {
  return Promise.reject(error);
});

export default service;

再utils里创建一个文件夹例如api,在api文件夹内创建文件,代码如下

import request from '@/utils/request'

export function getSliders(){
	return request({
		url:'/swiper'//你的接口
	})
}

在项目中直接引入此函数即可调用接口

vue使用axios拦截器自带loading

新创建文件夹

引入如下代码:

import axios from 'axios';
import { Message,Loading } from 'element-ui';
import _ from 'lodash';
  
const http = axios.create({
    baseURL:"", 
    timeout:40000 //超时时长
});
//loading对象
let loading;
  
//当前正在请求的数量
let needLoadingRequestCount = 0;
  
//显示loading
function showLoading() {
  // 后面这个判断很重要,因为关闭时加了抖动,此时loading对象可能还存在,
  // 但needLoadingRequestCount已经变成0.避免这种情况下会重新创建个loading
  if (needLoadingRequestCount === 0 && !loading) {
    loading = Loading.service({
      lock: true,
      text: "Loading...",
      background: 'rgba(255, 255, 255, 0.5)',
     //   target: target || "body"
    });
  }
  needLoadingRequestCount++;
}
  
//隐藏loading
function hideLoading() {
  needLoadingRequestCount--;
  needLoadingRequestCount = Math.max(needLoadingRequestCount, 0); //做个保护
  if (needLoadingRequestCount === 0) {
    //关闭loading
    toHideLoading();
  }
}
  
//防抖:将 300ms 间隔内的关闭 loading 便合并为一次。防止连续请求时, loading闪烁的问题。
var toHideLoading = _.debounce(()=>{
      loading.close();
      loading = null;
    }, 300);
  
//添加请求拦截器
let configs
http.interceptors.request.use(config => {
    configs=config
  //判断当前请求是否设置了不显示Loading
  if(config.headers.showLoading !== false){
    showLoading(config.headers.loadingTarget);
  }
  return config;
}, error => {
  //判断当前请求是否设置了不显示Loading
  if(configs.headers.showLoading !== false){
    hideLoading();
  }
  Message.error('请求超时!');
  return Promise.resolve(error);
});
  
//响应拦截器
http.interceptors.response.use(
    response => {
      //判断当前请求是否设置了不显示Loading(不显示自然无需隐藏)
      if(response.config.headers.showLoading !== false){
        hideLoading();
      }
      return response;
    },
    error => {
      //判断当前请求是否设置了不显示Loading(不显示自然无需隐藏)
      if(error.response && error.response.config.headers.showLoading !== false){
        hideLoading();
      }
      if(error.response && error.response.data && error.response.data.message) {
        var jsonObj = JSON.parse(error.response.data.message);
        Message.error(jsonObj.message);
      }else{
        Message.error(error.message);
      }
      return Promise.reject(error);
    }
);

export default http;




在main.js中引入

import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui';
import http from '@/api/index' //引入封装的axios
Vue.config.productionTip = false
Vue.use(ElementUI);
Vue.prototype.axios = http;//定义成原型属性方便使用
new Vue({
  render: h => h(App),
}).$mount('#app')

如果使用的话 直接

this.axios('/v1/topics').then(res=>{

 console.log(res.data);

 })

vue使用axios拦截器带进度条

npm install  nprogress

新建文件夹

// 对axios的二次封装
import axios from "axios";
//引入进度条
import nProgress from "nprogress";
//引入进度条样式
import "nprogress/nprogress.css";
//利用axios的、对象的create方法,去创建一个实例
const http = axios.create({
  //基础路径
  baseURL: "api",
  timeout: 5000,
});
//请求拦截器
http.interceptors.request.use((config) => {
  //进度条开始
  nProgress.start();
  return config;
});
//响应拦截器
http.interceptors.response.use(
  (res) => {
    //成功回调
    //进度条结束
    nProgress.done();
    return res.data;
  },
  (err) => {
    //失败回调 --终止promise链
    return Promise.reject(new Error("faill"));
  }
);

export default http;

如果需要模块化引入

新建文件

import http from '@/api/index2'
export const reqCateGroyList = () => {
    //发请求
    return http({
      url: "/v1/topics",
      method: "get",
    });
  };
  

使用 :

 import {reqCateGroyList} from '@/api/request'

  let request=await reqCateGroyList()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值