VUE使用element的Notification 通知固定通知数量(超出的数量存储或者删除)

需求

总所周知,element的Notification消息通知如果一直有消息来就会一直弹框,一直到浏览器填满。现在有个需求,固定弹框的数量达到固定数量后每×掉一个就继续弹框填充。写的组件不仅可以满足超出数量后存储起来还可以删除老消息以及将新消息优先级第一。

方案

resetMessage.js中
import { Notification } from 'element-ui'
const messageTypes = ['success', 'warning', 'error', 'info']

function ZMessage (options) {
  if (!(this instanceof ZMessage)) {
    return new ZMessage({...options,duration:0,showClose:true})
  }
  this.init({...options,duration:0,showClose:true})
}

ZMessage.queue = [] // 未展示数据的消息队列
ZMessage.instances = [] // 消息体实例列表
// 配置项
ZMessage.config = {
  max: 0, // 最大显示数
  isQueue: true, // 是否以队列形式存储为展示消息
  showNewest: false, // 是否后添加的消息覆盖前面的消息
  showClose: true, // 是否出现x关闭按钮
  dangerouslyUseHTMLString: true, // 是否将 message 属性作为 HTML 片段处理
  duration: 0, // 延迟时间
}

// 配置参数
ZMessage.setConfig = function (config = {}) {
  ZMessage.config = { ...ZMessage.config, ...config }
}

// 各消息类型静态方法
messageTypes.forEach(type => {
  ZMessage[type] = options => {
    let opts = options
    if (typeof options === 'string') {
      opts = {
        message: options
      }
    }
    return new ZMessage({ ...opts, type })
  }
})
// 初始化
ZMessage.prototype.init = async function (options) {
  const { max, isQueue, showNewest } = ZMessage.config
  // 判断如果超出最大消息数时,删除消息
  if (max > 0 && ZMessage.instances.length >= max && showNewest && !isQueue) {
    this.removeMessages()
  }
   // 传入了覆盖全部属性,  关闭全部消息
   if (options.overall) {
     ZMessage.closeAll()
     // 清空所有队列消息
     ZMessage.queue = []
   }
  if (ZMessage.instances.length >= max && isQueue) {
    // 添加队列元素
    ZMessage.queue.push(this.saveToQueue(options))
  } else if (ZMessage.instances.length < max || !max) {
    await this.setMessage(options)
  }
}

// 移除消息
ZMessage.prototype.removeMessages =  function () {
  const {
    instances,
    config: { max }
  } = ZMessage
  ZMessage.instances = instances.filter(async(instance, index) => {
    if (index < instances.length - max + 1) {
      await instance &&  instance.close()
      return false
    }
    return true
  })
}
// 获取消息实例和添加事件监听
ZMessage.prototype.setMessage = async function (options) {
  const instance = Notification(options)
  // 监听消息消失事件,从实例列表移除当前消息实例
  instance.$watch('visible', val => {
    //去除展示队列中被叉掉的消息
    ZMessage.instances = ZMessage.instances.filter( item => item !== instance)
    //如果是队列模式并且队列不为空,则取出一个消息展示
    if (ZMessage.config.isQueue && ZMessage.queue.length) {
      ZMessage.queue.shift()()
    }
  })
  //添加到展示消息队列
  ZMessage.instances.push(instance)
}
// 生成队列元素,延迟执行
ZMessage.prototype.saveToQueue =  function (options) {
  return (async() => {
    await this.setMessage(options)
  })
}

export default ZMessage

JS中调用:如果是vue中使用将Vue.prototype替换为this就行。如果不需要存储isQueue就改成false。

//引入resetMessage
import ZMessage  from "@/api/scada/resetMessage";

//除了组件中预制的配置,还可以自行添加
ZMessage.setConfig(({ max: 4, isQueue: true }));

// 当重要消息时, 可在调用时传入 overall 属性, 该消息会清空所有消息站
Vue.prototype.$notify({
  title: '我是notify'
  message: '我是Message',
  // overall: true
});

//ZMessage替代element的$notify
Vue.prototype.$notify = ZMessage

参考大神的文章(本人使用了没问题)

element ui message弹窗数量限制_elementplus elmessage 为啥连续提示最多只能提示三个-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值