vue封装全局弹窗警告组件this.$message.success问题

 更新时间:2023年09月26日 09:11:49   作者:默默的小跟班  
这篇文章主要介绍了vue封装全局弹窗警告组件this.$message.success问题,具有很的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

先上效果图。

背景有遮罩层,并且模糊,弹窗设置了最小宽度,文字超出范围,弹窗会自动扩展。

写一个弹窗组件

message.vue

<template>
  <!-- 遮罩层 也是整个组件的容器-->
  <div class="pop-container" v-if="isShow">
    <div class="message-container">
      <!-- 两个icon放在一个容器中,但是只显示一个 -->
      <div class="icon-container">
        <div class="icon-container-success" v-if="type === 'success'">
          <!-- 引用了iview的Icon组件 -->
          <Icon class="icon-checkmark" type="md-checkmark" size="30" color="#D8DCE9" />
        </div>
        <div class="icon-container-error" v-if="type === 'error'">
          <Icon class="icon-close" type="md-close" size="30" color="#D8DCE9" />
        </div>
      </div>
      <span class="message-text">{{ text }}</span>
    </div>
  </div>
</template>
<script>
export default {
  name: 'message',
  props: {
    type: {               // type控制是成功还是失败
      type: String,
      default: 'success',
    },
    text: {              // 弹窗的文字信息
      type: String,
      default: '',
    },
    isShow: {             // 整个遮罩和弹窗是否显示
      type: Boolean,
      default: true,
    },
  },
};
</script>
<style scoped lang="less">
.pop-container {
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 99999;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(24, 30, 53, 0.7);
  backdrop-filter: blur(10px);
}
.message-container {
  display: flex;
  justify-content: center;
  align-items: center;
  min-width: 384px;
  padding: 0 30px;
  height: 170px;
  background: #303e62;
  box-shadow: 0px 0px 30px rgba(0, 0, 0, 0.1);
  border-radius: 12px;
}
.icon-container {
  position: relative;
  height: 40px;
  width: 40px;
  border-radius: 50%;
  &-error {
    background-color: #fe1b1b;
    height: 40px;
    width: 40px;
    border-radius: 50%;
    .icon-close {
      position: absolute;
      right: 5px;
      bottom: 5px;
      font-weight: 900;
    }
  }
  &-success {
    background-color: #4ad991;
    height: 40px;
    width: 40px;
    border-radius: 50%;
    .icon-checkmark {
      position: absolute;
      right: 4px;
      bottom: 5px;
      font-weight: 900;
    }
  }
}
.message-text {
  margin-left: 12px;
  font-weight: 500;
  font-size: 18px;
  line-height: 27px;
}
</style>

配置js文件

message.js

<script>
  import vue from 'vue';
  // 引入上面写好的组件
  import Message from './message';
// 全局警告弹窗 第一个参数为提示的文本信息,第二个参数可选,为弹窗持续时间
// 可以提前看一下知识点,Vue.extend + vm.$mount,可以让我们在vue中用js一样的方法去直接调用一个组件
// https://www.cnblogs.com/hentai-miao/p/10271652.html
// 将vue组件利用Vue.extend方法变成一个组件构造器,相当于一个类
const MsgClass = vue.extend(Message);
const MsgMain = {
  show(text, type, duration) {
    // 实例化这个组件
    const instance = new MsgClass();
    // 将组件实例挂在到一个元素上面,如果不传参数就是挂载到body,或者也可以传入其他已经存在的元素的选择器
    instance.$mount(document.createElement('div'));
    // 通过组件实例的$el属性,可以访问到这个组件元素,然后把它拼接到body上。
    document.body.appendChild(instance.$el);
    // 给这个实例传入参数
    instance.type = type;
    instance.text = text;
    instance.isShow = true;
    // 设置一个延迟,过了时间弹窗消失
    setTimeout(() => {
      instance.isShow = false;
    }, duration);
  },
  // 成功时调用这个方法
  success(text, duration = 2000) {
    this.show(text, 'success', duration);
  },
  // 失败时调用这个方法
  error(text, duration = 2000) {
    this.show(text, 'error', duration);
  },
};
// 全局注册
function Msg() {
  vue.prototype.$msg = MsgMain;
  // 最终调用就是this.$msg.success() 或者this.$msg.error()
}
export default Msg;
</script>

全局注册组件

main.js

import Msg from '../src/components/message';
Vue.use(Msg);

使用

this.$msg.success('设置成功!');   // 第二个参数可以传入弹窗持续时间,默认是2000
this.$msg.success('设置成功!',3000);
this.$msg.error('设置失败!')

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue+elementUl导入文件方式(判断文件格式)

    vue+elementUl导入文件方式(判断文件格式)

    这篇文章主要介绍了vue+elementUl导入文件方式(判断文件格式),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Vue Echarts简易实现仪表盘

    Vue Echarts简易实现仪表盘

    这篇文章主要为大家详细介绍了Vue Echarts实现仪表盘案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-12-12
  • Vue3+script setup+ts+Vite+Volar搭建项目

    Vue3+script setup+ts+Vite+Volar搭建项目

    本文主要介绍了Vue3+script setup+ts+Vite+Volar搭建项目,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 解决vue.js提交数组时出现数组下标的问题

    解决vue.js提交数组时出现数组下标的问题

    今天小编就为大家分享一篇解决vue.js提交数组时出现数组下标的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Vue实现图片预览效果实例(放大、缩小、拖拽)

    Vue实现图片预览效果实例(放大、缩小、拖拽)

    现在项目中有这样的一个需求,对上传的图片可以点击之后在线预览,这篇文章主要给大家介绍了关于Vue实现图片预览效果实例(放大、缩小、拖拽)的相关资料,需要的朋友可以参考下
    2021-05-05
  • Vue动态组件component标签的用法大全

    Vue动态组件component标签的用法大全

    这篇文章主要介绍了Vue动态组件component标签的用法,在Vue中,可以通过component标签的is属性动态指定标签,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 解决vue初始化项目时,一直卡在Project description上的问题

    解决vue初始化项目时,一直卡在Project description上的问题

    今天小编就为大家分享一篇解决vue初始化项目时,一直卡在Project description上的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • Vue单页面应用保证F5强刷不清空数据的解决方案

    Vue单页面应用保证F5强刷不清空数据的解决方案

    最近小编遇到这样的问题当vue单页面按F5强刷,数据就恢复初始了,这怎么办呢?下面小编给大家带来了Vue单页面应用保证F5强刷不清空数据的解决方案,感兴趣的朋友一起看看吧
    2018-01-01
  • 解决v-model双向绑定失效的问题

    解决v-model双向绑定失效的问题

    这篇文章主要介绍了解决v-model双向绑定失效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue2从数据变化到视图变化发布订阅模式详解

    vue2从数据变化到视图变化发布订阅模式详解

    这篇文章主要为大家介绍了vue2从数据变化到视图变化发布订阅模式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论