基于vue写一个全局Message组件的实现


Posted in Javascript onAugust 15, 2019

不知道大家在用一些UI框架,比如Element-ui的时候,有没有觉得一些全局组件。this.$message(),this.Toast()等,用起来很爽。他们不像其他的组件,需要去导入,去注册。麻烦的很。

看了Element的源码,自己也撸了一个。其中包括了以前没有接触过的插件知识,哎,感觉自己对Vue的理解还是不够,只停留在了使用的这阶段。需要更多的往深层次的地方去钻。不说废话了,直接上代码。

效果演示

基于vue写一个全局Message组件的实现

全局组件需要一个index.js文件去注册

基于vue写一个全局Message组件的实现

BlogMessage.vue

这里的script是用ts写的。大家只需将这里稍做修改就可以了

<template>
 <transition name="slide">
  <div class="message-wrap" :class="type" v-if="visible">
   <div class="content">{{content}}</div>
  </div>
 </transition>
</template>
<script lang='ts'>
import { Component, Vue, Watch, Prop } from "vue-property-decorator";
@Component({
 components: {}
})
export default class extends Vue {
 private content: string = "";
 private visible: boolean = false;
 private type: string = "info"; // 'success','error'
 private startTimer() {
  window.setTimeout(() => {
   this.visible = false;
  }, 3000);
 }
 private mounted() {
  this.startTimer();
 }
}
</script>
<style scoped lang="scss">
.message-wrap {
 position: fixed;
 background-color: #44b0f3;
 color: #ffffff;
 left: 40%;
 width: 20%;
 top: 25px;
 height: 40px;
 z-index: 1001;
 border-radius: 4px;
 text-align: center;
 border: 1px solid #ebeef5;
 .content {
  line-height: 40px;
 }
}
.error {
 background-color: #fef0f0;
 color: #f56c6c;
}
.success {
 background-color: #f0f9eb;
 color: #67c23a;
}
.slide-enter-active,
.slide-leave-active {
 transition: all 0.3s cubic-bezier(1, 0.5, 0.8, 1);
 transition: all 0.2s ease;
}
.slide-enter,
.slide-leave-to {
 transform: translateY(-20px);
 opacity: 0;
}
</style>

index.js

import Vue from 'vue'
import BlogMessage from './BlogMessage.vue'
const MessageBox = Vue.extend(BlogMessage) // 创建的是一个组件构造器,不是实例
const Message = {
 install: (options, type, duration) => {
  if (options === undefined || options === null) {
   options = {
    content: ''
   }
  } else if (typeof options === 'string' || typeof options === 'number') {
   options = {
    content: options
   }
   if (type != undefined && options != null) {
    options.type = type;
   }
  }
  let instance = new MessageBox({
   data: options
  }).$mount()
  document.body.appendChild(instance.$el) // 添加dom元素
  Vue.nextTick(() => { // dom元素渲染完成后执行回调
   instance.visible = true
  })
 }
}
Vue.prototype.$message = Message.install;
['success', 'error'].forEach(type => {
 Vue.prototype.$message[type] = (content) => {
  return Vue.prototype.$message(content, type)
 }
})
export default Message

使用组件

1.全局注册

import Vue from 'vue';
import Message from '@/components/common/message';
Vue.use(Message);

2.调用方法

private test1() {
  this.$message("这是一条普通消息");
 }
 private test2() {
  this.$message.success("这是一条成功消息");
  // this.$message("这是一条成功消息", "success");
 }
 private test3() {
  this.$message.error("这是一条失败消息");
  // this.$message("这是一条失败消息", "error");
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Dom加载让图片加载完再执行的脚本代码
May 15 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
Jan 15 Javascript
JavaScript中5种调用函数的方法
Mar 12 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
Nov 13 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
Nov 24 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
Oct 13 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
Jun 10 Javascript
用Fundebug插件记录网络请求异常的方法
Feb 21 Javascript
如何使用webpack打包一个库library的方法步骤
Dec 18 Javascript
Vue双向绑定实现原理与方法详解
May 07 Javascript
react合成事件与原生事件的相关理解
May 13 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
Aug 15 #Javascript
解决vuex刷新状态初始化的方法实现
Aug 15 #Javascript
超详细的5个Shell脚本实例分享(值得收藏)
Aug 15 #Javascript
koa2+vue实现登陆及登录状态判断
Aug 15 #Javascript
原生js实现的移动端可拖动进度条插件功能详解
Aug 15 #Javascript
快速对接payjq的个人微信支付接口过程解析
Aug 15 #Javascript
Element-UI中关于table表格的那些骚操作(小结)
Aug 15 #Javascript
You might like
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
php实现的生成排列算法示例
2019/07/25 PHP
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
vue el-table实现行内编辑功能
2019/12/11 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
python的mysqldb安装步骤详解
2017/08/14 Python
Python实现线程状态监测简单示例
2018/03/28 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
中学生期中自我鉴定
2014/04/20 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
python 安全地删除列表元素的方法
2022/03/16 Python