今天我们来自己动手用实现一个message插件:

  Vue.js 的插件应该暴露一个 install 方法。这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象:

//message.vue
<template>
<transition name="msg-fade">
<div class="message" :class="type" v-show="visible">
<span class="icon"></span>
<p class="content">{{content}}</p>
<span class="delete-icon" @click="onCancle">x</span>
</div>
</transition>
</template> <script>
  const Msg = {
    name:'message',
    data(){
      return {
        visible:false,
        type:'',
        content:''
      }
    },
    install(Vue){
      Vue.prototype.$msg = (config)=>{ //通过原型注册一个方法
        const MessageConstructor = Vue.extend(Msg); //生成一个Vue子类,子类就是这个组件
        const instance = new MessageConstructor({data:config}); //生成该子类的实例
        instance.vm = instance.$mount(); //将该实例手动挂载
        document.body.appendChild(instance.vm.$el); //将实例挂载到body上
        instance.vm.visible = true;
      }
    }
  },
  watch:{
    visible(v){
      if(v){
        setTimeout(()=>{
          this.onClose()
        },3000)
      }
    }
   },
   methods:{
     onClose(){
       this.visible = false
       this.$el.parentNode.removeChild(this.$el)
     },
     show(){
       this.visible = true
     },
     onCancle(){
       if(this.cancelBtn){
          this.cancelBtn.apply(this.content)
       };
       this.onClose();
     }
   },   }   export default Msg
 </script>  <style scoped lang='less'>
    .message {
      position: fixed;
      left: 50%;
      top: 50%;
      transform: translate3d(-50%,-50%,0);
      background: rgba(0,0,0, 0.6);
      z-index: 1000;
      min-width: 288px;
      height: 32px;
      box-sizing: border-box;
      .icon{
        display: inline-block;
        width: 12px;
        height: 12px;
        margin-left: 16px;
        background: url(../assets/default.svg) no-repeat;  
        background-size: 12px 12px;
        vertical-align: middle;
      }
      &.success {
        background: #EBF8F2;
        border: 1px solid #A7E1C4;
        border-radius: 4px;
        .icon{
          background: url(../assets/success.svg)no-repeat;
          background-size: 12px 12px;
        }
      }
      &.warn {
        background: #FFFAEB;
        border: 1px solid #FCCCA7;
        border-radius: 4px;
        .icon{
          background: url(../assets/remind.svg)no-repeat;
          background-size: 12px 12px;
        }
      }
      &.error {
        background: #FEF3EB;
        border: 1px solid #FFE9A7;
        border-radius: 4px;
        .icon{
          background: url(../assets/error.svg)no-repeat;
          background-size: 12px 12px;
        }
      }
      .content{
        display: inline-block;
        font-size: 12px;
        color: rgba(0,0,0,0.65);
        letter-spacing: 0;
        line-height: 30px;
        margin-left: 8px;
      }
      .delete-icon{
        display: block;
        width: 10px;
        height: 10px;
        position:absolute;
        top:9px;
        right:12px;
        font-size:18px;
        line-height: 10px;  
        cursor: pointer;
        color: #000;
        opacity: .43;
      } 
    }     .msg-fade-enter-active {
      animation: alert-fade-in .3s;
    }     .msg-fade-leave-active {
      animation: alert-fade-out .3s;
    }     @keyframes alert-fade-in {
      0% {
        opacity: 0;
      }
      100% {
        opacity: 1;
      }
    }     @keyframes alert-fade-out {
      0% {
        opacity: 1;
      }
      100% {
        opacity: 0;
      }
    }
 </style> //main.js
import msg from './components/Message';
Vue.use(msg); //使用:
this.$msg({
  type:'error',
  content:'这是一条自定义消息'
})
效果如图

教你如何用Vue自己实现一个message插件的更多相关文章

  1. Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序

    Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序 引子   上期给大家介绍了如何使用如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓 ...

  2. 教你如何用PS制作多款按钮UI设计教程

    教你如何用PS制作多款按钮UI设计教程 本文教大家制作按钮的方法 LV. ★ 初入设计,学做按钮.只会套个底色,加个阴影,字体纯白,小聪明的弄个圆角. LV. ★★(描边.字体.内阴影) 看了很多案例 ...

  3. 手把手教你用Vue2+webpack+node开发一个H5 app

    手把手教你用Vue2+webpack+node开发一个H5 app ​前一篇vue2 + webpack + node 开发一个小demo说到了用vue的一些基本用法,这一篇就讲一个复杂一点的更完整的 ...

  4. 一篇文章教你如何用R进行数据挖掘

    一篇文章教你如何用R进行数据挖掘 引言 R是一种广泛用于数据分析和统计计算的强大语言,于上世纪90年代开始发展起来.得益于全世界众多 爱好者的无尽努力,大家继而开发出了一种基于R但优于R基本文本编辑器 ...

  5. 零元学Expression Design 4 - Chapter 5 教你如何用自制笔刷在5分钟内做出设计感效果

    原文:零元学Expression Design 4 - Chapter 5 教你如何用自制笔刷在5分钟内做出设计感效果 本章将教你如何运用笔刷与简单线条,只要5分钟,就能做出设计感效果 ? 本章将教你 ...

  6. 教你如何创建vue环境

    教你如何创建vue的环境 wdnmd我操作了一万年,终于成功创建了vue的环境,现在就来讲一下,到底应该怎么操作才能成功创建vue的 第一步 : 我们应该做的不是别的,而是去官方网站下载文件 node ...

  7. 如何用一月6RMB搭建一个国外服务器

    转载自我的博客:https://blog.ljyngup.com 前言 本文将教你如何用一月6RMB的价格搭建一个属于个人的外国服务器.并且一月500G流量,延迟低于500ms. 开始 导航:Virm ...

  8. Android | 教你如何用代码一键实现银行卡绑定

    前言   小编前面几期文章分别给大家介绍了用代码实现微笑抓拍.证件照DIY.拍照翻译的功能开发(链接见文章末尾),本次小编给大家带来的是用代码一键实现银行卡识别与绑定功能. 银行卡识别的应用场景    ...

  9. 如何用 React Native 创建一个iOS APP?(三)

    前两部分,<如何用 React Native 创建一个iOS APP?>,<如何用 React Native 创建一个iOS APP (二)?>中,我们分别讲了用 React ...

随机推荐

  1. Jenkins-正则表达式提取Cookie

    场景描述:用户登录查询数据:登录时响应头返回Cookie,将Cookie使用正则表达式提取出来,在下一个请求“查询数据”时,在请求头中使用此Cookie 1.添加“登录”http请求 2.在后置处理器 ...

  2. Java入门 - 语言基础 - 08.运算符

    原文地址:http://www.work100.net/training/java-operator.html 更多教程:光束云 - 免费课程 运算符 序号 文内章节 视频 1 概述 2 算术运算符 ...

  3. [bzoj1041] [洛谷P2508] [HAOI2008] 圆上的整点

    Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...

  4. Python错误与异常

    1 异常和错误 1.1 错误和异常 从软件方面来说,错误是语法或者逻辑上的,语法错误指示软件的结构上有错误,导致不能被解释器解释.当程序的语法正确后,剩下的就是逻辑错误了,逻辑错误可能是由于不完整或者 ...

  5. Java基础系列1:深入理解Java数据类型

    Java基础系列1:深入理解Java数据类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括四个 ...

  6. laravel5.5的服务容器分析

    简介 服务容器是Laravel的核心.见名知意,服务容器就是一个存放服务的地方,当我们需要某个服务的时候,我们就可以从这个容器中取出我们需要的服务.用更专业一点的术语来说,官网定义服务容器是这样的: ...

  7. flutter 与 android 混合开发

    现有的混合开发方式,都是存flutter项目在android系统或者iOS上面跑. 但是,实际情况是,我们需要在一个成熟的native项目上面,跑几个flutter页面,逐步的进行flutter的融合 ...

  8. reactNative-解决react native使用fetch函数 Network request failed 问题

    解决react native使用fetch函数Network request failed问题 最近公司新开发一个app, 用react native架构好后,用xcode模拟器打开app,对接登陆接 ...

  9. 保存网页内容到excel

    from selenium import webdriverfrom time import sleepfrom selenium.common.exceptions import NoSuchEle ...

  10. 类加载之 <clinit>() 和 <init>()

    前序文章:深入理解Java类加载 <clinit>() 与 <init>() 区别 一.<clinit>() Java 类加载的初始化过程中,编译器按语句在源文件中 ...