时间:2022-04-03 09:15:26 | 栏目:vue | 点击:次
在最近项目开发中,接口错误信息是在拦截器统一处理,在一次产品大大验收过程中,由于服务器没有重启完成,导致前端弹出一推错误提示语,产品大大对于提示语的交互效果提出了一系列的建议。由于项目使用了ElementUI框架,加上本人喜欢投(xin)机(shou)取(nian)巧(lai),于是去查看ElementUI Message的源码,根据实际需求自定义了Message功能。
场景描述
实现方案
场景一
功能描述
代码实现
新建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) } }
场景三
功能描述
代码实现
静态配置项和消息容器队列
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
小结