iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue中el-message如何封装使用
  • 174
分享到

vue中el-message如何封装使用

2023-06-29 03:06:12 174人浏览 薄情痞子
摘要

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

这篇文章将为大家详细讲解有关Vue中el-message如何封装使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

实现方法

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

方法一

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

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

vue中el-message如何封装使用

方法二

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

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

vue中el-message如何封装使用

方法三(有残缺的方法,可以带着问题看方法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,        });      };    });  }}//判断传入的是否是Objectfunction 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 })

vue中el-message如何封装使用

关于“vue中el-message如何封装使用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: vue中el-message如何封装使用

本文链接: https://www.lsjlt.com/news/322049.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • vue中el-message如何封装使用
    这篇文章将为大家详细讲解有关vue中el-message如何封装使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现方法实现方法有很多种,可以根据你实际项目情况决定使用哪一种。方法一直接css里面给这个...
    99+
    2023-06-29
  • vue中el-message的封装使用
    目录前言实现方法方法一方法二方法三(有残缺的方法,可以带着问题看方法4)方法四方法五最后前言 最近对项目进行改造,发现在el-message使用中,如果遇到服务器挂了或者在重启等其他...
    99+
    2024-04-02
  • vue中如何使用axios和封装
    这篇文章给大家分享的是有关vue中如何使用axios和封装的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue官方推荐使用 axios发送请求首先上需求1.需要封装全局调用2.返...
    99+
    2024-04-02
  • Vue使用v-model封装el-pagination组件的全过程
    使用v-model绑定分页信息对象,分页信息对象包括3个核心属性参数,分页事件直接绑定查询数据的方法,消除父组件的handleSizeChange和handleCurrentChan...
    99+
    2024-04-02
  • Vue使用v-model封装el-pagination组件的详细步骤
    这篇文章主要介绍“Vue使用v-model封装el-pagination组件的详细步骤”,在日常操作中,相信很多人在Vue使用v-model封装el-pagination组件的详细步骤问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-20
  • Vue如何使用Vuex封装并使用store
    这篇文章主要介绍“Vue如何使用Vuex封装并使用store”,在日常操作中,相信很多人在Vue如何使用Vuex封装并使用store问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue如何使用Vuex封装并使...
    99+
    2023-07-04
  • vue如何对el-autocomplete二次封装增加下拉分页
    这篇文章主要介绍vue如何对el-autocomplete二次封装增加下拉分页,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!项目中的联想输入框现在都是采用的el-autocomplete实现的,但是随着数据量越来越多...
    99+
    2023-06-29
  • 如何在vue中封装axios
    本篇文章为大家展示了如何在vue中封装axios,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。基础版第一步:配置axios首先,创建一个Service.js,这里面存放的时axios的配置以及拦截器...
    99+
    2023-06-15
  • Element使用el-table组件二次封装
    目录前言一、安装引入二、封装功能三、样式覆盖四、使用组件前言 在vue开发中使用element-ui的el-table时一般都需要进行封装以便于复用,提高开发效率,减少重复代码,这篇...
    99+
    2024-04-02
  • Vue封装svg-icon组件如何使用
    这篇文章主要介绍“Vue封装svg-icon组件如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue封装svg-icon组件如何使用”文章能帮助大家解决问题。一、SVG可缩放矢量图形SVG(...
    99+
    2023-07-05
  • 如何在vue项目中使用封装后的axios
    这篇文章给大家介绍如何在vue项目中使用封装后的axios,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。为什么要使用VueVue是一款友好的、多用途且高性能的JavaScript框架,使用vue可以创建可维护性和可测试...
    99+
    2023-06-06
  • Vue封装如何axios
    这篇文章主要介绍“Vue封装如何axios”,在日常操作中,相信很多人在Vue封装如何axios问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue封装如何axios”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-05
  • vue如何封装axios
    今天小编给大家分享一下vue如何封装axios的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。vue封装axios可以提高代码...
    99+
    2023-07-04
  • vue项目中如何封装echarts
    本文小编为大家详细介绍“vue项目中如何封装echarts”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中如何封装echarts”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。场景Echarts使用时,...
    99+
    2023-06-29
  • Vue项目中如何封装axios
    本文小编为大家详细介绍“Vue项目中如何封装axios”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue项目中如何封装axios”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、axios是什么axios 是...
    99+
    2023-06-30
  • vue如何使用vueslot封装公共组件
    目录使用vue slot封装公共组件使用slot插槽封装使用vue slot封装公共组件 公用子组件:publicSlot       <div>         <...
    99+
    2024-04-02
  • 在Vue中是如何封装axios
    目录1、安装1、引入3、接口根地址4、使用事例4.1下载4.2get4.3post1、安装 npm install axios; // 安装axios 1、引入 imp...
    99+
    2024-04-02
  • 如何用vue封装axios请求
    其实vue封装axios是很简单的 首先 在src路径下建http文件夹 并且创建api.js env.js request.js 这三个文件 env.js文件 这个文件主要就是封...
    99+
    2024-04-02
  • 如何用Vue实现Dialog封装
    这篇文章主要讲解了“如何用Vue实现Dialog封装”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用Vue实现Dialog封装”吧!在写业务的时候很常见...
    99+
    2024-04-02
  • Vue前端如何对axios的封装和使用
    这篇文章将为大家详细讲解有关Vue前端如何对axios的封装和使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Axios 是一个基于 promise 的 HTTP 库。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作