赞
踩
https://www.jianshu.com/p/da13467f69c0
https://gitee.com/chensanjin/fast-tortoise
查看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 })
}
})
// resetMessage.js import { Message } from 'element-ui' const messageTypes = ['success', 'warning', 'error', 'info'] function ZMessage (options) { if (!(this instanceof ZMessage)) { return new ZMessage({...options,duration:1000,showClose:true}) } this.init({...options,duration:1000,showClose:true}) } ZMessage.queue = [] // 未展示数据的消息队列 ZMessage.instances = [] // 消息体实例列表 // 配置项 ZMessage.config = { max: 0, // 最大显示数 isQueue: false, // 是否以队列形式存储为展示消息 showNewest: true, // 是否后添加的消息覆盖前面的消息 showClose: true, // 是否出现x关闭按钮 dangerouslyUseHTMLString: true, // 是否将 message 属性作为 HTML 片段处理 duration: 1000, // 延迟时间 } // 配置参数 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 = 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 = Message(options) // 监听消息消失事件,从实例列表移除当前消息实例 instance.$watch('visible', val => { ZMessage.instances = ZMessage.instances.filter( item => item !== instance) if (ZMessage.config.isQueue && ZMessage.queue.length) { ZMessage.queue.shift()() } }) await ZMessage.instances.push(instance) } // 生成队列元素,延迟执行 ZMessage.prototype.saveToQueue = function (options) { return (async() => { await this.setMessage(options) }) } export default ZMessage // 使用方式 import ZMessage from '@/utils/resetMessage.js' // 自定义配置项 ZMessage.setConfig({ max: 1, isQueue: false, showNewest: true }) // 当重要消息时, 可在调用时传入 overall 属性, 该消息会清空所有消息站, 作为优先级第一的消息发出, Demo 如下 this.$message({ message: '恭喜你,这是一条成功消息', type: 'success', overall: true }); // 覆盖默认$message Vue.prototype.$message = ZMessage
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。