我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue中el-message的封装使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue中el-message的封装使用

前言

最近对项目进行改造,发现在el-message使用中,如果遇到服务器挂了或者在重启等其他情况,页面message会弹出一大堆报错信息,看起来很不美观,所以对el-message进行重写改造,这里记录下改造中遇到的问题和实现,希望能对你有点帮助。

实现方法

实现方法有很多种,可以根据你实际项目情况决定使用哪一种。

方法一

直接css里面给这个样式,简单省事,但是这样子有一个问题所有的message都重叠在一起,浅入浅出的动画效果不好,不是很推荐。

.el-message {
  top: 20px !important;
}

方法二

直接使用el-message的closeAll方法,弹消息之前关闭所有的消息,也很简单,但是这样会有一个明显的抖动,所以也不是很推荐(不介意的话也可以这样写)。

  this.$message.closeAll();
  this.$message.error("错误提示3");

方法三(有残缺的方法,可以带着问题看方法4)

对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,
          });
        }
      };
    });
  }
}

这样弹消息即使多次触发,也只会弹一个消息出来,正当我以为已经完事了,却发现还有新的问题:

  • 问题1:this.$message({type:'error',message:'测试消息'}) 报错了
  • 问题2:弹的消息不会更新,必须要等上一条消息消失后,才会出现新的

方法四

对于方法三存在的两个问题,所以我们需要对方法三进行改造,还是那个文件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封装内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue中el-message的封装使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue中el-message如何封装使用

这篇文章将为大家详细讲解有关vue中el-message如何封装使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现方法实现方法有很多种,可以根据你实际项目情况决定使用哪一种。方法一直接css里面给这个
2023-06-29

Vue使用v-model封装el-pagination组件的详细步骤

这篇文章主要介绍“Vue使用v-model封装el-pagination组件的详细步骤”,在日常操作中,相信很多人在Vue使用v-model封装el-pagination组件的详细步骤问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作
2023-06-20

vue中关于el-popover的使用

这篇文章主要介绍了vue中关于el-popover的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-15

Vue ElementUI在el-table中怎么使用el-popover

本文小编为大家详细介绍“Vue ElementUI在el-table中怎么使用el-popover”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue ElementUI在el-table中怎么使用el-popover”文章能帮助大家解决
2023-07-06

vue中怎么使用el-popover

本文小编为大家详细介绍“vue中怎么使用el-popover”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中怎么使用el-popover”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。关于el-popove
2023-07-06

Vue ElementUI在el-table中使用el-popover问题

这篇文章主要介绍了Vue ElementUI在el-table中使用el-popover问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-15

vue el-table中使用el-select选中后无效的解决

这篇文章主要介绍了vue el-table中使用el-select选中后无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

vue方法封装并使用

Vue是一种流行的JavaScript框架,它将数据和UI进行了强大的绑定,并提供了许多有用的功能。在Vue应用程序中,您可能需要编写一些通用的方法,这些方法将在整个应用程序中使用。为了提高代码的可重用性和可维护性,最好将这些方法封装成Vue插件并在需要的地方使用。本文将介绍如何封装Vue方法并在应用程序中使用它们。## 封装Vue插件Vue插件是一个具有install方法的J
2023-05-20

vue中$refs和$el怎么使用

这篇文章主要介绍“vue中$refs和$el怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue中$refs和$el怎么使用”文章能帮助大家解决问题。用法:1、“$refs”用于给元素或子组
2023-06-29

OpenLayer基于vue的封装使用教程

这篇文章主要介绍了OpenLayer基于vue的封装使用,openlayer使用的版本是"^6.4.3",引入了mapbox的样式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

Element怎么使用el-table组件实现二次封装

这篇文章主要讲解了“Element怎么使用el-table组件实现二次封装”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Element怎么使用el-table组件实现二次封装”吧!一、安装引
2023-07-02

如何在vue项目中使用封装后的axios

这篇文章给大家介绍如何在vue项目中使用封装后的axios,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。为什么要使用VueVue是一款友好的、多用途且高性能的JavaScript框架,使用vue可以创建可维护性和可测试
2023-06-06

编程热搜

目录