重写element-ui中的Message,实现相同消息提示只弹一个

本文介绍如何解决Element UI中message频繁重复显示的问题,通过重写message方法,实现只在页面上显示唯一的消息,避免同一消息在短时间内多次弹出,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

element-ui中的message在实际使用过程中很多时候会遇到,相同的message会在短时间内同时出现在页面上,这种情况下是没有必要的。比如一个错误信息提示被放在定时器中进行:定时调用某个接口,然后这个接口会返回一个message的话,在定时器时间设置很短的情况下,就会出现短时间内弹出很多相同的message。我们可以通过重写element-ui的message来解决这个问题。

1.新建一个js文件,比如element_api.js

/* eslint-disable */
import { Message } from 'element-ui'

const showMessage = Symbol('showMessage')
/**
 * 封装element-ui message方法,只有在页面没有message或者没有相同message的情况下才弹出该message
 */
class ElMessage {
  success (options, single = true) {
    this[showMessage]('success', options, single)
  }
  warning (options, single = true) {
    this[showMessage]('warning', options, single)
  }
  info (options, single = true) {
    this[showMessage]('info', options, single)
  }
  error (options, single = true) {
    this[showMessage]('error', options, single)
  }
  /* eslint-disable */
  [showMessage] (type, options, single) {
    console.log('message options:',options)
    if (single) {
      //获取页面所有已经存在的message
      let doms = document.getElementsByClassName('el-message');
      //el-message__content
      //设置值控制显示当前message
      let canShow = true;
      //遍历获取到的message DOM集合
      for( let i=0; i<doms.length; i++){
        //如果页面已存在的message中有显示文本和当前message相同的情况,canShow设置为false
        if(options == doms[i].getElementsByClassName('el-message__content')[0].innerHTML){
          canShow = false;
        }
      }
      //如果页面不存在message或者canShow==true,则正常执行该message
      if(doms.length === 0 || canShow){
        Message[type](options)
      }
    } else {
      Message[type](options)
    }
  }
}

export {
  ElMessage
}

2.使用方法

(1) 作为vue实例的属性来调用,跟element一样
//在main.js中引入
import { ElMessage } from '@/assets/js/element_api.js'
Vue.prototype.$message = new ElMessage()
//接下来就可以在组件通过 this.$message    的方式调用了
(2) 直接使用,比如我在axios拦截器js文件中使用
import { ElMessage } from '@/assets/js/element_api.js'
let Message = new ElMessage()

//使用
// http响应拦截器
axios.interceptors.response.use(res => {
  if(res.data.error == 5004){
    //登录失效
    Message.error('登录失效,请重新登录!')
    router.push('/')
  }
  return res
},
### Async Validator 版本升级的影响分析 `async-validator` 是一个用于表单验证的库,广泛应用于前端框架中。当 `async-validator` 从版本 1.8.5 升级至 4.0.4 时,可能会引入一些不兼容的变化,这些变化可能会影响依赖它的组件库(如 Element UI)。以下是具体影响及其解决方案: #### 主要变更点 1. **API 变更**: 在新版本中,某些方法签名或参数结构可能发生改变。例如,在旧版中使用的同步验证逻辑可能被移除或者改为异步支持[^2]。 2. **错误处理机制调整**: 新版本改进了错误对象的返回方式,可能导致原有的错误捕获逻辑失效。开发者需要更新自定义错误处理器来适配新的接口设计[^3]。 3. **性能优化与新增功能**: 随着版本迭代,`async-validator` 增加了一些增强特性并提升了运行效率。然而,这同时也意味着部分内部实现细节发生了更改,需重新评估现有代码是否受到影响[^4]。 #### 修改建议 为了使项目顺利迁移到最新版本,可以采取以下措施: - **检查文档差异**: 审查官方发布的 changelog 文件, 明确指出哪些地方存在破坏性改动 [^5]. - **重构受影响模块**: 如果发现原有调用不符合当前 API 要求,则应按照新版说明重写相应片段。 - **测试覆盖范围扩展**: 加强单元测试力度以确保迁移后的稳定性;特别关注边界情况下的表现行为是否有异常发生 [^6]. 下面给出一段简单的 JavaScript 示例演示如何基于最新的 async-validator 进行基本字段校验操作: ```javascript const validator = require('async-validator'); function validateForm(data) { const desc = { email: 'required|email', password: [{ type:'string', min:6 }] }; let vldtr = new validator(desc); try{ vldtr.validateSync(data); // Throws error if invalid. console.log("Validation passed."); }catch(err){ console.error(`Validation failed: ${err.message}`); } } ``` 上述函数通过创建描述符字典指定待检验属性规则,并利用实例化后的validateSync 方法执行即时反馈型检测过程 [^7].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值