Element-UI之Message功能拓展

在最近項目開發(fā)中,接口錯誤信息是在攔截器統(tǒng)一處理犬钢,在一次產(chǎn)品大大驗收過程中稠氮,由于服務器沒有重啟完成,導致前端彈出一推錯誤提示語昨寞,產(chǎn)品大大對于提示語的交互效果提出了一系列的建議瞻惋。由于項目使用了ElementUI框架,加上本人喜歡投(xin)機(shou)仍摇(nian)巧(lai)歼狼,于是去查看ElementUI Message的源碼,根據(jù)實際需求自定義了Message功能享怀。

場景描述

  • 場景一:限制頁面同時展示消息提示語的最大數(shù)量(優(yōu)先展示后插入的提示語)

  • 場景二:根據(jù)不同情況可以優(yōu)先顯示新/舊消息提示語

  • 場景三:如果超出了最大顯示數(shù)量羽峰,則剩余的消息以隊列的顯示依次展示

實現(xiàn)方案

場景一

  • 功能描述

    • 根據(jù)設置的最大數(shù)量,如果存儲的實例列表instances長度超出最大限制數(shù)則銷毀之前的消息實例instance(調(diào)用Message方法創(chuàng)建消息提示語會返回當前消息的一個實例),否則保存新建實例instance到實例列表instances

    • 如果消息提示語消失梅屉,需要從實例列表instances中移除當前實例instance值纱,確保頁面顯示消息數(shù)量與instances列表長度統(tǒng)一

  • 代碼實現(xiàn)

    新建ZMessage構(gòu)造函數(shù)

    
    import { Message } from 'element-ui'
    
    
    
    function ZMessage (options) {
    
        if (!(this instanceof ZMessage)) {
    
            return new ZMessage(options)
    
        }
    
        this.init(options)
    
    }
    
    

    靜態(tài)配置項和實例列表

    
    ZMessage.config = {
    
      max: 0, // 最大顯示數(shù)
    
    }
    
    
    
    ZMessage.instances = [] // 消息體實例列表
    
    

    定義創(chuàng)建消息和監(jiān)聽實例消失事件方法

    
    ZMessage.prototype.setMessage = function (options) {
    
      const instance = Message(options)
    
      // 監(jiān)聽消息消失事件,從實例列表移除當前消息實例
    
      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
    
      // 判斷如果超出最大消息數(shù)時坯汤,刪除消息
    
      if (max > 0 && ZMessage.instances.length >= max) {
    
        this.removeMessages() :
    
      }
    
      if (ZMessage.instances.length < max || !max) {
    
        this.setMessage(options)
    
      }
    
    }
    
    

場景二

  • 功能描述

    • 在場景一的基礎(chǔ)上新增優(yōu)先取消息還是舊消息的標志操作
  • 代碼實現(xiàn)

    靜態(tài)配置項和實例列表

    
    ZMessage.config = {
    
      max: 0, // 最大顯示數(shù)
    
      showNewest: true // 是否后添加的消息覆蓋前面的消息
    
    }
    
    

    初始化

    
    ZMessage.prototype.init = function (options) {
    
      const { max, showNewest } = ZMessage.config
    
      // 判斷如果超出最大消息數(shù)時虐唠,刪除消息
    
      if (max > 0 && ZMessage.instances.length >= max && showNewest) {
    
        this.removeMessages()
    
      }
    
      if (ZMessage.instances.length < max || !max) {
    
        this.setMessage(options)
    
      }
    
    }
    
    

場景三

  • 功能描述

    • 在場景一場景二基礎(chǔ)上添加是否使用隊列方式存儲未展示消息的實例,如果超出了最大限制數(shù)則創(chuàng)建消息實例的容器存儲到消息隊列queue

    • 監(jiān)聽是否有消息消失惰聂,如果有則從消息隊列queue中取出第一個容器疆偿,創(chuàng)建消息實例

  • 代碼實現(xiàn)

    靜態(tài)配置項和消息容器隊列

    
    ZMessage.config = {
    
      max: 0, // 最大顯示數(shù)
    
      showNewest: true, // 是否后添加的消息覆蓋前面的消息
    
      isQueue: false // 是否以隊列形式存儲為展示消息
    
    }
    
    
    
    ZMessage.queue = [] // 未展示數(shù)據(jù)的消息容器隊列
    
    

    生成隊列

    
    // 生成隊列元素,延遲執(zhí)行
    
    ZMessage.prototype.saveToQueue = function (options) {
    
      return () => {
    
        this.setMessage(options)
    
      }
    
    }
    
    

    初始化

    
    // 初始化
    
    ZMessage.prototype.init = function (options) {
    
      const { max, isQueue, showNewest } = ZMessage.config
    
      // 判斷如果超出最大消息數(shù)時搓幌,刪除消息
    
      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)
    
      }
    
    }
    
    

    獲取消息實例和添加事件監(jiān)聽

    
    // 獲取消息實例和添加事件監(jiān)聽
    
    ZMessage.prototype.setMessage = function (options) {
    
      const instance = Message(options)
    
      // 監(jiān)聽消息消失事件杆故,從實例列表移除當前消息實例
    
      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)
    
    }
    
    

最后一步

添加不同消息類型功能靜態(tài)方法


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

// 各消息類型靜態(tài)方法

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 = [] // 未展示數(shù)據(jù)的消息隊列

ZMessage.instances = [] // 消息體實例列表

// 配置項

ZMessage.config = {

  max: 0, // 最大顯示數(shù)

  isQueue: false, // 是否以隊列形式存儲為展示消息

  showNewest: true // 是否后添加的消息覆蓋前面的消息

}

// 配置參數(shù)

ZMessage.setConfig = function (config = {}) {

  ZMessage.config = { ...ZMessage.config, ...config }

}

ZMessage.close = Message.close

ZMessage.closeAll = Message.closeAll

// 各消息類型靜態(tài)方法

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

  // 判斷如果超出最大消息數(shù)時,刪除消息

  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

  })

}

// 獲取消息實例和添加事件監(jiān)聽

ZMessage.prototype.setMessage = function (options) {

  const instance = Message(options)

  // 監(jiān)聽消息消失事件溉愁,從實例列表移除當前消息實例

  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)

}

// 生成隊列元素处铛,延遲執(zhí)行

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

小結(jié)

希望看完本篇文章能對你拓展ElementUI框架的Message組件功能有所幫助。

文中如有錯誤拐揭,歡迎在評論區(qū)指正撤蟆,如果這篇文章有幫助到你,歡迎點贊和關(guān)注投队。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枫疆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子敷鸦,更是在濱河造成了極大的恐慌,老刑警劉巖寝贡,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒披,死亡現(xiàn)場離奇詭異,居然都是意外死亡圃泡,警方通過查閱死者的電腦和手機碟案,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颇蜡,“玉大人价说,你說我怎么就攤上這事》绯樱” “怎么了鳖目?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缤弦。 經(jīng)常有香客問我领迈,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任狸捅,我火速辦了婚禮衷蜓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尘喝。我一直安慰自己磁浇,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布朽褪。 她就那樣靜靜地躺著扯夭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鞍匾。 梳的紋絲不亂的頭發(fā)上交洗,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音橡淑,去河邊找鬼构拳。 笑死,一個胖子當著我的面吹牛梁棠,可吹牛的內(nèi)容都是我干的置森。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼符糊,長吁一口氣:“原來是場噩夢啊……” “哼凫海!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起男娄,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤行贪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后模闲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體建瘫,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年尸折,在試婚紗的時候發(fā)現(xiàn)自己被綠了啰脚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡实夹,死狀恐怖橄浓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亮航,我是刑警寧澤荸实,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站塞赂,受9級特大地震影響泪勒,放射性物質(zhì)發(fā)生泄漏昼蛀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一圆存、第九天 我趴在偏房一處隱蔽的房頂上張望叼旋。 院中可真熱鬧,春花似錦沦辙、人聲如沸夫植。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽详民。三九已至,卻和暖如春陌兑,著一層夾襖步出監(jiān)牢的瞬間沈跨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工兔综, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饿凛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓软驰,卻偏偏與公主長得像涧窒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锭亏,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容