Vue 封装http 请求

封装message 提示

Message.js

javascript 复制代码
import { ElMessage } from "element-plus";
 
const showMessage = (msg,callback,type)=>{
    ElMessage({
        message: msg,
        type: type,
        duration: 3000,
        onClose:()=>{
            if (callback) {
                callback();
            }
        }
    });    
}

const message = {
    error: (msg,callback) => {
        showMessage(msg,callback,'error');
    },
    success: (msg,callback) => {
        showMessage(msg,callback,'success');
    },
    warning: (msg,callback) => {
        showMessage(msg,callback,'warning');
    },
    info: (msg,callback) => {
        showMessage(msg,callback,'info');
    }
}
// 导出
export default message;

封装Request.js

javascript 复制代码
import axios from "axios";
import { ElLoading } from "element-plus";
import Message from "./Message";
const contentTypeForm = "application/x-www-form-urlencoded";
const contentTypeJson = "application/json";

// 创建实例
const instance = axios.create({
  baseURL: "/api",
  timeout: 15 * 1000,// 15 秒
});

let loading = null;
// 请求前置过滤器
instance.interceptors.request.use(
    (config) => {
        if (config.showLoading) {
            loading = ElLoading.service({
                lock: true,
                text: '加载中',
                background: 'rgba(0, 0, 0, 0.7)'
            });            
        }
      return config;// 返回很重要
    },
    (error) => {
        // 请求错误 也要记得关闭弹窗
        if (error.config.showLoading && loading) {
            loading.close();
        }
        // 提示错误信息
        Message.error("请求发送失败啦");
      return Promise.reject(error);
    }
  );
// 请求后置过滤器
instance.interceptors.response.use(
    (response) => {
        const { showLoading, errorCallBack,showError } = response.config;
        // 关闭请求
        if (showLoading) {
            loading.close();
        }
        const responseData = response.data;
        if (responseData.code === 200) {
            return responseData;
        }else if (responseData.code === 901) {
            return Promise.reject({ showError: false, msg:"登录超时"});
        }else {
            if (errorCallBack) {
                errorCallBack(responseData)
            }
            return Promise.reject({ showError:showError, msg:responseData.info});
        }
    },(error) =>{
        if (error.config.showLoading) {
            loading.close();
        }
        return Promise.reject({showError:true,msg:"网络异常"});
    });

const request = (config) => {
  const {url,params,dataType,showLoading = true,errorCallBack,showError = true}  = config;
  let contentType = contentTypeForm;
  let formData = new FormData();
  // 拼接参数
  for (let key in params) {
    formData.append(key, params[key] == undefined ? "" : params[key]); 
  }
  if (dataType === "json" && dataType != null) {
    contentType = contentTypeJson;    
  }
  let headers = {
    "Content-Type": contentType,
    "X-Requested-With": "XMLHttpRequest",
    
  };
  return instance.post(url, formData, {
    headers: headers,
    showLoading: showLoading,
    errorCallBack: errorCallBack,
  }).catch(error => {
    if (showError) {
      Message.error(error.msg);
    }
    return null;
  });
};

// 导出request
export default request;
相关推荐
.Cnn21 分钟前
JavaScript 前端基础笔记(网页交互核心)
前端·javascript·笔记·交互
醉酒的李白、36 分钟前
Vue3 组件通信本质:Props 下发,Emits 回传
前端·javascript·vue.js
小眼哥1 小时前
SpringBoot整合Vue代码生成exe运行程序以及windows安装包
vue.js·windows·spring boot
徐小夕1 小时前
PDF无限制预览!Jit-Viewer V1.5.0开源文档预览神器正式发布
前端·vue.js·github
吴声子夜歌2 小时前
Vue.js——自定义指令
前端·vue.js·flutter
小芝麻咿呀2 小时前
vue--面试题第一部分
前端·javascript·vue.js
nibabaoo2 小时前
前端开发攻略---H5页面手机获取摄像头权限回显出画面并且同步到PC页面
javascript·websocket·实时音视频·实时同步·录制
早起傻一天~G3 小时前
vue2+element-UI表格封装
javascript·vue.js·ui
这儿有一堆花3 小时前
深入解析 Video.js:现代 Web 视频播放的工程实践
前端·javascript·音视频
烤麻辣烫3 小时前
JS基础
开发语言·前端·javascript·学习