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;
相关推荐
多加点辣也没关系2 分钟前
JavaScript|第9章:对象 — 基础
开发语言·javascript·ecmascript
用户831348593069819 分钟前
Cesium自定义可调节星空夜景+星星闪烁
vue.js·cesium
后台开发者Ethan1 小时前
setState组件更新
前端·javascript·react
蜡台2 小时前
uniapp vue2 转 vue3
前端·javascript·uni-app·vue3·vue2
用户125758524362 小时前
Go 里读取 request body 后,下游拿不到参数:别让日志中间件把请求吃掉
http·go·测试
WindfallSheng2 小时前
从Vibe Coding到Spec Coding:一套可落地的AI-SDD企业级研发实战工程
javascript·vue.js
Asize2 小时前
Agent 入门:从 LLM 与 Agent 的区别到 Function Calling
javascript·人工智能
我有满天星辰3 小时前
Vue 指令完全指南:从 Vue 2 到 Vue 3 的演进与实战
前端·javascript·vue.js
小白学过的代码3 小时前
# flv.js / mpegts.js 播不了国标摄像头(H.265 + G.711A)?纯前端 Jessibuca 无后端方案(附完整代码)
前端·javascript·h.265
曾令胜3 小时前
HTTP协议基础总结
网络·网络协议·http