vue提示弹窗插件(alert、confirm、msg)

使用Vue开发的过程中,我们会在很多地方用到一些同样的功能,比如说提示弹窗,这种时候我们可以自定义一个插件,方便在多个地方使用。

项目目录结构:

image.png

-modules:放置模块的文件夹,里面有一个 alert 文件夹,用于存放 alert 插件 ;
-Alert.vue:就是我们要在多处用到提示弹窗组件;
-index.js:对于该自定义插件的一些配置;

代码编写:

Alert.vue
<template>
  <!-- 初始状态下隐藏提示框 -->
  <div v-show="isShow">
    <div class="alert" :class="type">
      <div class="flex" >{{msg}}</div>
      <!-- alert插件只显示确定按钮 -->
      <div class="space-around" v-if="type === 'alert'">
        <div class="btnCommon success" @click="close">确定</div>
      </div>
      <!-- confirm插件显示取消和确定按钮 -->
      <div class="space-around" v-else-if="type === 'confirm'">
        <div class="btnCommon cancel" @click="cancelEvent">取消</div>
        <div class="btnCommon success" @click="successEvent">确定</div>
      </div>

    </div>
    <!-- 背景遮罩 -->
    <div class="mask" @click="closeMask" v-if="type !== 'msg'"></div>
  </div>
</template>

<script>
  export default {
    name: 'Alert',
    props: {
      // 提示信息
      msg: {
        type: String,
        default: ''
      },
      // 是否显示提示框
      isShow: {
        type: Boolean,
        default: false
      },
      // 插件类型:alert/confirm
      type: {
        type: String,
        default: 'alert'
      },
      // confirm插件接收的确认事件
      success: {
        type: Function,
        default: () => {
          console.log('点击了success');
        }
      },
      // confirm插件接收的取消事件
      cancel: {
        type: Function,
        default: () => {
          console.log('点击了cancel');
        }
      }
    },
    methods: {
      // 关闭弹窗
      close() {
        this.isShow = false
      },
      // alert 插件点击阴影区域关闭弹窗
      closeMask() {
        if(this.type === 'alert') {
          this.close();
        }
      },
      // confirm 插件点击取消触发的事件
      cancelEvent() {
        this.cancel();
        this.close();
      },
      // confirm 插件点击确定触发的事件
      successEvent() {
        this.success();
        this.close();
      }
    },
    updated(){
      var _this = this;
      if(_this.type == 'msg'){
        setTimeout(function(){_this.close()},1500);
      }
    }
  }



// 调用实例
//    this.$alert('测试')
//    this.$confirm('测试Confirm', () => {
//      console.log('这是确定事件');
//    }, () => {
//      console.log('这是取消事件');
//    })
//    this.$msg('测试')

</script>
<style lang="stylus" rel="stylesheet/stylus">
  .alert {
    width: 500px;
    height: auto;
    position: fixed;
    left: 50%;
    margin-left: -250px;
    top: 50%;
    margin-top: -75px;
    background-color: #fff;
    border-radius: 15px;
    box-shadow: 0 5px 8px rgba(0, 0, 0, .05);
    z-index: 3000;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
  }

  .msg{
    background-color: rgba(0, 0, 0, 0);
    box-shadow:none;
  }
  .msg .flex{
      padding: 20px 40px!important;
      background-color: #fff;
      border-radius :10px;
      box-shadow: 10px 10px 18px rgba(0, 0, 0, .2);
    }

  .flex {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 40px 30px;
    word-break: break-all;
    line-height:40px;
  }
  .space-around {
    display: flex;
    justify-content: space-around;
    align-items: center;
    width: 100%;
    border-top:1px solid #cfcfcf;
  }

  .btnCommon {
    width: 250px;
    height: 92px;
    line-height: 92px;
    text-align: center;
    border-radius: 6px;
  &.success {
     background-color: $btnMain;
     color: #EC736F;
     cursor: pointer;
  &:hover {
     background-color: $btnDark;
   }
  }
  &.cancel {
      width: 249px;
      color: #333;
      cursor: pointer;
      border-right: 1px solid #cfcfcf;
    }
  }

  .mask {
    position: fixed;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, .4);
    left: 0;
    top: 0;
    overflow: hidden;
    z-index: 2000;
  }
  .msg .mask{
    display: none;
  }
</style>
index.js
/**
 * Created by ZD on 2020/11/3.
 */
import AlertComponent from './Alert.vue';

const Alert = {}

// Vue暴露了一个install方法,用于自定义插件
Alert.install = function (Vue) {
  // 创建一个子类
  const AlertConstructor = Vue.extend(AlertComponent);
  // 实例化这个子类
  const instance = new AlertConstructor();
  // 创建一个div元素,并把实例挂载到div元素上
  instance.$mount(document.createElement('div'));
  // 将el插入到body元素中
  document.body.appendChild(instance.$el);

  // 添加实例方法
  // msg插件的实例方法:只接收提示信息msg
  Vue.prototype.$msg = msg => {
    instance.type = 'msg';
    instance.msg = msg;
    instance.isShow = true;
  };
  // alert插件的实例方法:只接收提示信息msg
  Vue.prototype.$alert = msg => {
    instance.type = 'alert';
    instance.msg = msg;
    instance.isShow = true;
  };
  // confirm插件的实例方法,可以接收三个参数
  // msg:提示信息
  // success:点击确定执行的函数
  // cancel:点击取消执行的函数
  Vue.prototype.$confirm = (msg, success, cancel) => {
    instance.type = 'confirm';
    instance.msg = msg;
    instance.isShow = true;
    if(typeof success !== 'undefined') {
      instance.success = success;
    }
    if(typeof cancel !== 'undefined') {
      instance.cancel = cancel;
    }
  }
}

export default Alert;
至此,我们的自定义插件就差最后点睛一笔了,只需要使用 Vue.use 方法将插件安装进去即可。
main.js
import Vue from 'vue'
import App from './App.vue'
import alert from './modules/alert'
 
Vue.config.productionTip = false
Vue.use(alert)  // 注意,Vue.use方法必须在new Vue之前被调用
 
new Vue({
  render: h => h(App),
}).$mount('#app')

使用方法:

App.vue
<template>
  <div id="app">
    <button @click="handleAlert">alert</button>
    <button @click="handleConfirm">confirm</button>
    <button @click="handleMsg">alert</button>
  </div>
</template>
 
<script>
 
export default {
  name: 'App',
  methods: {
    handleAlert() {
      this.$alert('测试')
    },
    handleConfirm() {
      this.$confirm('测试Confirm', () => {
        console.log('这是确定事件');
      }, () => {
        console.log('这是取消事件');
      })
    },
    handleMsg() {
      this.$msg('测试')
    }
  }
}
</script>

页面效果

1.alert


image.png

2.confirm


image.png

3.msg
image.png
此文章在原作者插件基础上增加了msg,显示时间可自行设定

原文https://blog.csdn.net/sinat_40697723/article/details/106036056

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容