ElementUI之Message功能拓展详解


Posted in Javascript onOctober 18, 2019

在最近项目开发中,接口错误信息是在拦截器统一处理,在一次产品大大验收过程中,由于服务器没有重启完成,导致前端弹出一推错误提示语,产品大大对于提示语的交互效果提出了一系列的建议。由于项目使用了ElementUI框架,加上本人喜欢投(xin)机(shou)取(nian)巧(lai),于是去查看ElementUI Message的源码,根据实际需求自定义了Message功能。

场景描述

  • 场景一:限制页面同时展示消息提示语的最大数量(优先展示后插入的提示语)
  • 场景二:根据不同情况可以优先显示新/旧消息提示语
  • 场景三:如果超出了最大显示数量,则剩余的消息以队列的显示依次展示

实现方案

场景一

功能描述

  • 根据设置的最大数量,如果存储的实例列表instances长度超出最大限制数则销毁之前的消息实例instance(调用Message方法创建消息提示语会返回当前消息的一个实例),否则保存新建实例instance到实例列表instances中
  • 如果消息提示语消失,需要从实例列表instances中移除当前实例instance,确保页面显示消息数量与instances列表长度统一

代码实现

新建ZMessage构造函数import { Message } from 'element-ui'

function ZMessage (options) {
  if (!(this instanceof ZMessage)) {
    return new ZMessage(options)
  }
  this.init(options)
}

静态配置项和实例列表

ZMessage.config = {
 max: 0, // 最大显示数
}

 
ZMessage.instances = [] // 消息体实例列表

定义创建消息和监听实例消失事件方法

ZMessage.prototype.setMessage = function (options) {
 const instance = Message(options)
 // 监听消息消失事件,从实例列表移除当前消息实例
 instance.$watch('visible', val => {
  ZMessage.instances = ZMessage.instances.filter(item => item !== instance)
 })
 ZMessage.instances.push(instance)
}

定义移除消息实例方法

ZMessage.prototype.prototype.removeMessages = function () {
 const {
  instances,
  config: { max }
 } = ZMessage
 ZMessage.instances = instances.filter((instance, index) => {
  if (index < instances.length - max + 1) {
   instance && instance.close()
   return false
  }
  return true
 })
}

初始化消息

ZMessage.prototype.init = function (options) {
 const { max } = ZMessage.config
 // 判断如果超出最大消息数时,删除消息
 if (max > 0 && ZMessage.instances.length >= max) {
  this.removeMessages() :
 }
 if (ZMessage.instances.length < max || !max) {
  this.setMessage(options)
 }
}

场景二

功能描述

  • 在场景一的基础上新增优先取消息还是旧消息的标志操作

代码实现

静态配置项和实例列表

ZMessage.config = {
 max: 0, // 最大显示数
 showNewest: true // 是否后添加的消息覆盖前面的消息
}

初始化

ZMessage.prototype.init = function (options) {
 const { max, showNewest } = ZMessage.config
 // 判断如果超出最大消息数时,删除消息
 if (max > 0 && ZMessage.instances.length >= max && showNewest) {
  this.removeMessages()
 }
 if (ZMessage.instances.length < max || !max) {
  this.setMessage(options)
 }
}

场景三

功能描述

  • 在场景一场景二基础上添加是否使用队列方式存储未展示消息的实例,如果超出了最大限制数则创建消息实例的容器存储到消息队列queue中
  • 监听是否有消息消失,如果有则从消息队列queue中取出第一个容器,创建消息实例

代码实现

静态配置项和消息容器队列

ZMessage.config = {
 max: 0, // 最大显示数
 showNewest: true, // 是否后添加的消息覆盖前面的消息
 isQueue: false // 是否以队列形式存储为展示消息
}

ZMessage.queue = [] // 未展示数据的消息容器队列

生成队列

// 生成队列元素,延迟执行
ZMessage.prototype.saveToQueue = function (options) {
 return () => {
  this.setMessage(options)
 }
}

初始化

// 初始化
ZMessage.prototype.init = function (options) {
 const { max, isQueue, showNewest } = ZMessage.config
 // 判断如果超出最大消息数时,删除消息
 if (max > 0 && ZMessage.instances.length >= max && showNewest && !isQueue) {
  this.removeMessages()
 }

 if (ZMessage.instances.length >= max && isQueue) {
  // 添加队列元素
  ZMessage.queue.push(this.saveToQueue(options))
 } else if (ZMessage.instances.length < max || !max) {
  this.setMessage(options)
 }
}

获取消息实例和添加事件监听

// 获取消息实例和添加事件监听
ZMessage.prototype.setMessage = function (options) {
 const instance = Message(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)
}

最后一步

添加不同消息类型功能静态方法

const messageTypes = ['success', 'warning', 'error', 'info']

// 各消息类型静态方法
messageTypes.forEach(type => {
 ZMessage[type] = options => {
  let opts = options
  if (typeof options === 'string') {
   opts = {
    message: options
   }
  }
  return new ZMessage({ ...opts, type })
 }
})

完整代码

// ZMessage.js
import { Message } from 'element-ui'

const messageTypes = ['success', 'warning', 'error', 'info']

function ZMessage (options) {
 if (!(this instanceof ZMessage)) {
  return new ZMessage(options)
 }
 this.init(options)
}

ZMessage.queue = [] // 未展示数据的消息队列

ZMessage.instances = [] // 消息体实例列表

// 配置项
ZMessage.config = {
 max: 0, // 最大显示数
 isQueue: false, // 是否以队列形式存储为展示消息
 showNewest: true // 是否后添加的消息覆盖前面的消息
}

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

ZMessage.close = Message.close

ZMessage.closeAll = Message.closeAll

// 各消息类型静态方法
messageTypes.forEach(type => {
 ZMessage[type] = options => {
  let opts = options
  if (typeof options === 'string') {
   opts = {
    message: options
   }
  }
  return new ZMessage({ ...opts, type })
 }
})

// 初始化
ZMessage.prototype.init = function (options) {
 const { max, isQueue, showNewest } = ZMessage.config
 // 判断如果超出最大消息数时,删除消息
 if (max > 0 && ZMessage.instances.length >= max && showNewest && !isQueue) {
  this.removeMessages()
 }

 if (ZMessage.instances.length >= max && isQueue) {
  // 添加队列元素
  ZMessage.queue.push(this.saveToQueue(options))
 } else if (ZMessage.instances.length < max || !max) {
  this.setMessage(options)
 }
}

// 移除消息
ZMessage.prototype.removeMessages = function () {
 const {
  instances,
  config: { max }
 } = ZMessage
 ZMessage.instances = instances.filter((instance, index) => {
  if (index < instances.length - max + 1) {
   instance && instance.close()
   return false
  }
  return true
 })
}

// 获取消息实例和添加事件监听
ZMessage.prototype.setMessage = function (options) {
 const instance = Message(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 () => {
  this.setMessage(options)
 }
}

export default ZMessage


// 使用方式
import Vue from 'vue'
import ZMessage from 'path/to/ZMessage.js'
// 引入Element
// ....

// 自定义配置项
ZMessage.setConfig({ max: 1, isQueue: false, showNewest: true })

// 覆盖默认$message
Vue.prototype.$message = ZMessage

小结

希望看完本篇文章能对你拓展ElementUI框架的Message组件功能有所帮助。也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中检测变量的类型的代码
Dec 28 Javascript
Extjs Gird 支持中文拼音排序实现代码
Apr 15 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
Dec 12 Javascript
js控制li的隐藏和显示实例代码
Oct 15 Javascript
Bootstrap模态框禁用空白处点击关闭
Oct 20 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 Javascript
基于JS实现仿百度百家主页的轮播图效果
Mar 06 Javascript
JS实现动态添加DOM节点和事件的方法示例
Apr 28 Javascript
Vue的路由动态重定向和导航守卫实例
Mar 17 Javascript
利用PHP实现递归删除链表元素的方法示例
Oct 23 Javascript
JS实现购物车基本功能
Nov 08 Javascript
javascript对象3个属性特征
Nov 17 Javascript
js实现简易计算器功能
Oct 18 #Javascript
JavaScript实现更换背景图片
Oct 18 #Javascript
jquery轻量级数字动画插件countUp.js使用详解
Oct 17 #jQuery
CountUp.js数字滚动插件使用方法详解
Oct 17 #Javascript
CountUp.js实现数字滚动增值效果
Oct 17 #Javascript
countUp.js实现数字动态变化效果
Oct 17 #Javascript
jQuery/JS监听input输入框值变化实例
Oct 17 #jQuery
You might like
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
jquery 防止表单重复提交代码
2010/01/21 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
深入理解Python装饰器
2016/07/27 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
python实现微信自动回复机器人功能
2019/07/11 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
Python远程linux执行命令实现
2020/11/11 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
理工类毕业自我鉴定
2014/02/20 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
英文慰问信范文
2015/03/24 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
Python中requests做接口测试的方法
2021/05/30 Python
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python