在最近项目开发中,接口错误信息是在拦截器统一处理,在一次产品大大验收过程中,由于服务器没有重启完成,导致前端弹出一推错误提示语,产品大大对于提示语的交互效果提出了一系列的建议。由于项目使用了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组件功能有所帮助。也希望大家多多支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】