解决在axios网络请求里错误频繁弹出elementui message的情况

如题,当然这个也可以平常使用,主要是修改messageBox的这种情况,我们先来说axios里的情况

首先我们先封装一个组件,在组件的目录层级下,新建一个resetMessage.js

**重置message,防止重复点击重复弹出message弹框 */
import { Message } from 'element-ui'

let messageInstance = null
const resetMessage = (options) => {
    if (messageInstance) {
        messageInstance.close()
    }
    messageInstance = Message(options)
}
['error', 'success', 'info', 'warning'].forEach(type => {
	resetMessage[type] = options => {
		if (typeof options === 'string') {
			options = {
				message: options
			}
		}
		options.type = type
		return resetMessage(options)
	}
})

export const message = resetMessage

简单讲解下,实现逻辑就是如果在触发这个组件的时候回去检测上一个message实例是否还存在,还存在的话就关闭上一个message实例 然后重新创建,这样的话就能够有效的避免突然刷刷刷一堆提醒的问题


2.接下去在封装好的axios里面引入

import axios from "axios";

import { message } from "./resetMessage";
import { MessageBox } from "element-ui";
import Router from "../router/index";

const serves = axios.create({
  baseURL: process.env.BASE_API,
 
  timeout: 10000,
});

// 设置请求发送之前的拦截器
serves.interceptors.request.use(
  (config) => {
    // 可以动态设置后台地址
    const serverUrl = JSON.parse(localStorage.getItem("serverUrl")) || "";

    // 判断是不是admin登录
    
    if (serverUrl) {
      config.url = serverUrl + config.url;
    }
 

    // 设置请求头
    const tokenInfo = JSON.parse(localStorage.getItem("tokenInfo")) || "";
    if (!tokenInfo) {
      config.headers["token"] = "";
     
    } else {
      // config.headers["token"] = "";
      const token = tokenInfo.tokenName + "=" + tokenInfo.tokenValue;

      config.headers["token"] = token;
    }
    return config;
  },
  (err) => Promise.reject(err)
);

// 设置请求接受拦截器
serves.interceptors.response.use(
  (res) => {
    // 成功的请求
    if (res.status === 200) {
      if (res.data) {
        // 只返回data里的数据
        if (res.data.header.rspcode == "-2") {
          MessageBox.alert("登陆过期", "提示", {
            confirmButtonText: "登录",
            type: "warning",
          }).then(() => {
            Router.push("/login");
            // need do something
            // location.reload()
          });
        } else {
          
          return res.data;
        }
      }
    } else {
      // 请求失败
      console.log("errrrrrr");
      message.error(res.data.header.message);
      return res;
    }
  },
  (err) => {
    if (err.message === "Network Error") {
      

      MessageBox.alert("网络异常,请稍后重试", "提示", {
        confirmButtonText: "确定",
        type: "warning",
      });
    } else if (err.message === "timeout of 10000ms exceeded") {
      message.error("网络响应超时,请检查网络或者请求参数是否正确");
    } else {
      message.error(err);
    }

    console.log("err:", err);

    return Promise.reject(err);
  }
);

// 将serves抛出去
export default serves;

这里是我封装的request的组件,里面用了elementui里的MessageBox和刚刚上文讲的message
用MessageBox主要是会有一个交互,如果登陆过期了就弹个可以确认的框,确认后就前往首页

自己封装的message主要是一个提醒 无交互,封装后防止频繁弹出

P.s. elementui里的MessageBox还是会有频繁弹出的问题 网上找了好像也没有很好的解决方案,多数都是说message的 然后如果要平时使用不是在axios里使用的话就可以在main.js里引入挂载即可

import resetMessage from "@/utils/resetMessage.js";
Vue.prototype.$resetMessage = resetMessage;

最后的最后,看到这里觉得有用可以点个赞~ 也欢迎大家互相讨论

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值