<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近對專案進行改造,發現在el-message使用中,如果遇到伺服器掛了或者在重啟等其他情況,頁面message會彈出一大堆報錯資訊,看起來很不美觀,所以對el-message進行重寫改造,這裡記錄下改造中遇到的問題和實現,希望能對你有點幫助。
實現方法有很多種,可以根據你實際專案情況決定使用哪一種。
直接css裡面給這個樣式,簡單省事,但是這樣子有一個問題所有的message都重疊在一起,淺入淺出的動畫效果不好,不是很推薦。
.el-message { top: 20px !important; }
直接使用el-message的closeAll方法,彈訊息之前關閉所有的訊息,也很簡單,但是這樣會有一個明顯的抖動,所以也不是很推薦(不介意的話也可以這樣寫)。
this.$message.closeAll(); this.$message.error("錯誤提示3");
對message進行改造,重寫message方法,新建一個message.js,定義一個class類,給這個class賦予success,error,info,warning4個方法,根據el-message的使用方法,分為:this.$message.success('測試成功訊息') 和this.$message({type:'success',message:'測試成功訊息'})這兩種情況,所以要根據傳入的值是字串還是物件做一下判斷。
import { Message } from "element-ui"; class ZMessage { constructor() { ["success", "error", "info", "warning"].forEach((type) => { this[type] = function (options) { if (isObject(options)) { const { type='info', ...rest } = options; Message({ type, ...rest, }); return; } Message({ type: type, message: options, }); }; }); } } //判斷傳入的是否是Object function isObject(content) { return ( Object.prototype.toString.call(content) === "[object Object]" && !!content.message ); } export default new ZMessage;
然後在main.js裡面引入,覆蓋掉el-message的方法
import ZMessage from "@/utils/message"; Vue.prototype.$message = ZMessage;
這樣message重寫第一步就完成了,第二步需要判斷當前message的數量,如果小於1,就彈訊息,仔細觀察message,我們可以通過document.getElementsByClassName("el-message").length來獲取當前彈框的數量,如果大於等於1就不再彈框,如果小於1就彈框。
class ZMessage { constructor() { ["success", "error", "info", "warning"].forEach((type) => { this[type] = function (options) { //這裡加一個判斷 if (document.getElementsByClassName("el-message").length === 0) { if (isConfig(options)) { const { type = "info", ...rest } = options; Message({ type, ...rest, }); return; } Message({ type: type, message: options, }); } }; }); } }
這樣彈訊息即使多次觸發,也只會彈一個訊息出來,正當我以為已經完事了,卻發現還有新的問題:
對於方法三存在的兩個問題,所以我們需要對方法三進行改造,還是那個檔案message.js,這裡不用class了,因為對外export的方法是new ZMessage(),message的值無法直接傳遞過來,暫時還沒有想好咋傳過來,所以就不用class了,所以對ZMessage進行下改造
const ZMessage = function (options) { if (isObject(options)) { const { type = "info", ...rest } = options; showMessage({ type, ...rest, }) return; } showMessage({ type: options.type || "info", message: options, }) }; ["success", "error", "info", "warning"].forEach((type) => { ZMessage[type] = function (options) { if (isObject(options)) { ZMessage({ type: type, ...options, }); return; } ZMessage({ type, message: options, }); }; }); function isObject(content) { return ( Object.prototype.toString.call(content) === "[object Object]" && !!content.message ); } function showMessage(options) { Message({ ...options }); } export default ZMessage;
這樣第一個問題,this.$message({type:'error',message:'測試訊息'})就不會報錯了,接下來解決第二個問題,值不會更新的問題,可以定義一個msgInstance變數,如果有新的值來了,就關閉上一個訊息
var msgInstance = null; const ZMessage = function (options) { if (msgInstance) { //更新彈框 msgInstance.close(); } if (isObject(options)) { const { type = "info", ...rest } = options; showMessage({ type, ...rest, }) return; } showMessage({ type: options.type || "info", message: options, }) }; ["success", "error", "info", "warning"].forEach((type) => { ZMessage[type] = function (options) { if (isObject(options)) { ZMessage({ type: type, ...options, }); return; } ZMessage({ type, message: options, }); }; }); function isObject(content) { return ( Object.prototype.toString.call(content) === "[object Object]" && !!content.message ); } function showMessage(options) { msgInstance=Message({ ...options }); } export default ZMessage;
這樣就完美解決了上面出現的兩個問題,到這裡目標基本已經實現;但是,又想到如果要求不止出現一個message,我要只出現兩個甚至多個怎麼辦,所以在方法四的基礎上,改造出來方法五,參考ant-design-vue,對最大數量可調配。
定義一個maxCount引數,需要message全域性定義,在呼叫message方法之前,先定下message的最大數量,每次點選彈框的時候都往messageList裡面插入一個當前的message範例,close的時候將這條資料刪除,再給message新加一個config方法,maxCount就傳給config方法,在這個裡面設定。
import { Message } from "element-ui"; // 定義message的當前數量 var messageList = []; // 定義初始最大數量 var messageMaxCount = 0; const ZMessage = function (options) { if (messageMaxCount && messageList.length >= messageMaxCount) { //更新彈框 messageList[0].close(); } if (isObject(options)) { const { type = "info", ...rest } = options; messageList.push( showMessage({ type, ...rest, }) ); return; } messageList.push( showMessage({ type: options.type || "info", message: options, }) ); }; ["success", "error", "info", "warning"].forEach((type) => { ZMessage[type] = function (options) { if (isObject(options)) { ZMessage({ type: type, ...options, }); return; } ZMessage({ type, message: options, }); }; }); ZMessage.config = function (options) { const { maxCount } = options; if (maxCount) { if (typeof maxCount !== "number") { return console.error("引數型別錯誤:maxCount應為number型別"); } messageMaxCount = maxCount; } }; function isObject(content) { return ( Object.prototype.toString.call(content) === "[object Object]" && !!content.message ); } function showMessage(options) { const { onClose:close, ...rest } = options; return Message({ ...rest, //關閉時,除了傳入的close方法,還需要將對應的範例刪除 onClose: (val) => { if(close){ close() } messageList = messageList.filter((item) => item.id != val.id); }, }); } export default ZMessage;
使用:
this.$message.config({ maxCount:3 })
到這裡,el-message就已經改造完畢,你可以根據自己的實際情況使用上面的任意方法,希望這個文章能對你有所幫助,還有其他的辦法可以評論留言下,大家一起學習進步。
到此這篇關於vue中el-message的封裝使用的文章就介紹到這了,更多相關vue el-message封裝內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45