Skip to content

Element UI 短时间内 Message 消息弹出多次解决方案

一般在项目中,都会封装请求,在项目中会统一封装一个错误 message 提示,在某些页面调接口,若是同一时间内都失败,会不断弹出提示,例如:

这种同一类型的 message 可以合并成为一个,用户体验会更好

思路

节流,检测 message 的类型是否一致,以及 提示内容 是否一致。如果类型不一致,并且内容也不一致,才允许第 2 条 message 弹出。

代码实现

js
import { Message } from "element-ui";

const showMessageFunc = function () {
  const messageList = [];
  return function (options) {
    const index = messageList.findIndex(
      (item) => item.type === options.type && item.message === options.message
    );
    if (index >= 0) {
      return messageList[index].$ele;
    }
    const ele = Message(options);
    messageList.push({
      type: options.type,
      message: options.message,
      $ele: ele,
    });
    setTimeout(() => {
      messageList.splice(index, 1);
    }, options.duration || 3000);
    return ele;
  };
};
const showMessage = showMessageFunc();

const OnceMessage = function (options) {
  if (
    !["[object Object]", "[object String]", "[object Number]"].includes(
      Object.prototype.toString.call(options)
    )
  ) {
    options = {
      message: "",
    };
  }
  if (["string", "number"].includes(typeof options)) {
    options = {
      message: `${options}`,
    };
  }
  return showMessage(options);
};

["success", "warning", "info", "error"].forEach((type) => {
  OnceMessage[type] = (options) => {
    if (
      !["[object Object]", "[object String]", "[object Number]"].includes(
        Object.prototype.toString.call(options)
      )
    ) {
      options = {
        message: "",
      };
    }
    if (["string", "number"].includes(typeof options)) {
      options = {
        message: `${options}`,
      };
    }
    options.type = type;
    return OnceMessage(options);
  };
});

OnceMessage.close = Message.close;
OnceMessage.closeAll = Message.closeAll;

export default OnceMessage;