最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ElementUI之Message功能拓展詳解

 更新時(shí)間:2019年10月18日 09:44:35   作者:ZCoder  
這篇文章主要介紹了ElementUI之Message功能拓展詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在最近項(xiàng)目開(kāi)發(fā)中,接口錯(cuò)誤信息是在攔截器統(tǒng)一處理,在一次產(chǎn)品大大驗(yàn)收過(guò)程中,由于服務(wù)器沒(méi)有重啟完成,導(dǎo)致前端彈出一推錯(cuò)誤提示語(yǔ),產(chǎn)品大大對(duì)于提示語(yǔ)的交互效果提出了一系列的建議。由于項(xiàng)目使用了ElementUI框架,加上本人喜歡投(xin)機(jī)(shou)?。╪ian)巧(lai),于是去查看ElementUI Message的源碼,根據(jù)實(shí)際需求自定義了Message功能。

場(chǎng)景描述

  • 場(chǎng)景一:限制頁(yè)面同時(shí)展示消息提示語(yǔ)的最大數(shù)量(優(yōu)先展示后插入的提示語(yǔ))
  • 場(chǎng)景二:根據(jù)不同情況可以?xún)?yōu)先顯示新/舊消息提示語(yǔ)
  • 場(chǎng)景三:如果超出了最大顯示數(shù)量,則剩余的消息以隊(duì)列的顯示依次展示

實(shí)現(xiàn)方案

場(chǎng)景一

功能描述

  • 根據(jù)設(shè)置的最大數(shù)量,如果存儲(chǔ)的實(shí)例列表instances長(zhǎng)度超出最大限制數(shù)則銷(xiāo)毀之前的消息實(shí)例instance(調(diào)用Message方法創(chuàng)建消息提示語(yǔ)會(huì)返回當(dāng)前消息的一個(gè)實(shí)例),否則保存新建實(shí)例instance到實(shí)例列表instances中
  • 如果消息提示語(yǔ)消失,需要從實(shí)例列表instances中移除當(dāng)前實(shí)例instance,確保頁(yè)面顯示消息數(shù)量與instances列表長(zhǎng)度統(tǒng)一

代碼實(shí)現(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)配置項(xiàng)和實(shí)例列表

ZMessage.config = {
 max: 0, // 最大顯示數(shù)
}

 
ZMessage.instances = [] // 消息體實(shí)例列表

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

ZMessage.prototype.setMessage = function (options) {
 const instance = Message(options)
 // 監(jiān)聽(tīng)消息消失事件,從實(shí)例列表移除當(dāng)前消息實(shí)例
 instance.$watch('visible', val => {
  ZMessage.instances = ZMessage.instances.filter(item => item !== instance)
 })
 ZMessage.instances.push(instance)
}

定義移除消息實(shí)例方法

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ù)時(shí),刪除消息
 if (max > 0 && ZMessage.instances.length >= max) {
  this.removeMessages() :
 }
 if (ZMessage.instances.length < max || !max) {
  this.setMessage(options)
 }
}

場(chǎng)景二

功能描述

  • 在場(chǎng)景一的基礎(chǔ)上新增優(yōu)先取消息還是舊消息的標(biāo)志操作

代碼實(shí)現(xiàn)

靜態(tài)配置項(xiàng)和實(shí)例列表

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

初始化

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

場(chǎng)景三

功能描述

  • 在場(chǎng)景一場(chǎng)景二基礎(chǔ)上添加是否使用隊(duì)列方式存儲(chǔ)未展示消息的實(shí)例,如果超出了最大限制數(shù)則創(chuàng)建消息實(shí)例的容器存儲(chǔ)到消息隊(duì)列queue中
  • 監(jiān)聽(tīng)是否有消息消失,如果有則從消息隊(duì)列queue中取出第一個(gè)容器,創(chuàng)建消息實(shí)例

代碼實(shí)現(xiàn)

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

ZMessage.config = {
 max: 0, // 最大顯示數(shù)
 showNewest: true, // 是否后添加的消息覆蓋前面的消息
 isQueue: false // 是否以隊(duì)列形式存儲(chǔ)為展示消息
}

ZMessage.queue = [] // 未展示數(shù)據(jù)的消息容器隊(duì)列

生成隊(duì)列

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

初始化

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

 if (ZMessage.instances.length >= max && isQueue) {
  // 添加隊(duì)列元素
  ZMessage.queue.push(this.saveToQueue(options))
 } else if (ZMessage.instances.length < max || !max) {
  this.setMessage(options)
 }
}

獲取消息實(shí)例和添加事件監(jiān)聽(tīng)

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

最后一步

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

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

// 各消息類(lèi)型靜態(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ù)的消息隊(duì)列

ZMessage.instances = [] // 消息體實(shí)例列表

// 配置項(xiàng)
ZMessage.config = {
 max: 0, // 最大顯示數(shù)
 isQueue: false, // 是否以隊(duì)列形式存儲(chǔ)為展示消息
 showNewest: true // 是否后添加的消息覆蓋前面的消息
}

// 配置參數(shù)
ZMessage.setConfig = function (config = {}) {
 ZMessage.config = { ...ZMessage.config, ...config }
}

ZMessage.close = Message.close

ZMessage.closeAll = Message.closeAll

// 各消息類(lèi)型靜態(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ù)時(shí),刪除消息
 if (max > 0 && ZMessage.instances.length >= max && showNewest && !isQueue) {
  this.removeMessages()
 }

 if (ZMessage.instances.length >= max && isQueue) {
  // 添加隊(duì)列元素
  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
 })
}

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

// 生成隊(duì)列元素,延遲執(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
// ....

// 自定義配置項(xiàng)
ZMessage.setConfig({ max: 1, isQueue: false, showNewest: true })

// 覆蓋默認(rèn)$message
Vue.prototype.$message = ZMessage

小結(jié)

希望看完本篇文章能對(duì)你拓展ElementUI框架的Message組件功能有所幫助。也希望大家多多支持腳本之家。

相關(guān)文章

  • 不能通過(guò)IP地址訪問(wèn)VUE項(xiàng)目的問(wèn)題及解決

    不能通過(guò)IP地址訪問(wèn)VUE項(xiàng)目的問(wèn)題及解決

    這篇文章主要介紹了不能通過(guò)IP地址訪問(wèn)VUE項(xiàng)目的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 詳解vue-cli 接口代理配置

    詳解vue-cli 接口代理配置

    本篇主要介紹了vue-cli 接口代理配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Vue使用NProgress的操作過(guò)程解析

    Vue使用NProgress的操作過(guò)程解析

    這篇文章主要介紹了Vue使用NProgress的操作過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 使用axios請(qǐng)求接口,幾種content-type的區(qū)別詳解

    使用axios請(qǐng)求接口,幾種content-type的區(qū)別詳解

    今天小編就為大家分享一篇使用axios請(qǐng)求接口,幾種content-type的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • Vue3組件中g(shù)etCurrentInstance()獲取App實(shí)例,但是返回null的解決方案

    Vue3組件中g(shù)etCurrentInstance()獲取App實(shí)例,但是返回null的解決方案

    這篇文章主要介紹了Vue3組件中g(shù)etCurrentInstance()獲取App實(shí)例,但是返回null的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Vue2.0 axios前后端登陸攔截器(實(shí)例講解)

    Vue2.0 axios前后端登陸攔截器(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇Vue2.0 axios前后端登陸攔截器(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • vue中vant組件樣式失效問(wèn)題及解決

    vue中vant組件樣式失效問(wèn)題及解決

    這篇文章主要介紹了vue中vant組件樣式失效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue3.0在組件外使用VueI18n的情況

    Vue3.0在組件外使用VueI18n的情況

    這篇文章主要介紹了Vue3.0在組件外使用VueI18n的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue?parseHTML?函數(shù)源碼解析

    vue?parseHTML?函數(shù)源碼解析

    這篇文章主要為大家介紹了vue?parseHTML函數(shù)的源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • vue如何使用swiper插件修改左右箭頭的默認(rèn)樣式

    vue如何使用swiper插件修改左右箭頭的默認(rèn)樣式

    這篇文章主要介紹了vue如何使用swiper插件修改左右箭頭的默認(rèn)樣式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論

宁晋县| 邻水| 湖州市| 皋兰县| 乌拉特后旗| 监利县| 浮山县| 安岳县| 阳谷县| 嘉荫县| 通辽市| 个旧市| 北碚区| 江都市| 石嘴山市| 黔西县| 漳州市| 邮箱| 灵川县| 彰武县| 泸西县| 宁强县| 富裕县| 永川市| 家居| 余干县| 尼玛县| 江源县| 邵阳县| 芒康县| 承德市| 遂宁市| 房产| 衡南县| 西昌市| 吐鲁番市| 灯塔市| 芜湖市| 瑞安市| 谷城县| 莒南县|