解决element-ui message在短时间内多次弹出的问题

2,147 阅读1分钟

解决element-ui message在短时间内多次弹出的问题

使用element-ui的时候经常遇到一个页面会同时调N个接口,或者短时间内频繁点击某个接口,message组件会连续弹出,占到满屏的情况。大多数时候消息提示的内容是重复的,从用户角度来说,体验会很差。用户只需要知道一次错误消息就好了。

并且这个问题需要全局去处理,因为一个项目里用到message组件的地方太多了,不可能都单独去处理。

image.png

主要思路

整体上使用到了节流的思路,判断message的类型是否一致,和判断提示内容是否一致。如果类型不一致,且内容也不一致,才允许第2条message弹出。

附上代码

// 通过节流来控制message的展示
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 MyMessage = 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 => {
  MyMessage[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 MyMessage(options);
  };
});

MyMessage.close = Message.close;
MyMessage.closeAll = Message.closeAll;

export default MyMessage;

另有一篇修改viewui的message频繁弹出的方案可移步主页查看。