基于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 相关文章推荐
Chrome中模态对话框showModalDialog返回值问题的解决方法
May 25 Javascript
js css 实现遮罩层覆盖其他页面元素附图
Sep 22 Javascript
html的DOM中Event对象onabort事件用法实例
Jan 21 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
Mar 18 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
JS简单编号生成器实现方法(附demo源码下载)
Apr 05 Javascript
原生javascript 学习之js变量全面了解
Jul 14 Javascript
jquery Banner轮播选项卡
Dec 26 Javascript
在 Angular 中实现搜索关键字高亮示例
Mar 21 Javascript
vue引入ueditor及node后台配置详解
Jan 03 Javascript
js中调用微信的扫描二维码功能的实现代码
Apr 11 Javascript
js this 绑定机制深入详解
Apr 30 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
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
python下如何让web元素的生成更简单的分析
2008/07/17 Python
布同 统计英文单词的个数的python代码
2011/03/13 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
Python tkinter和exe打包的方法
2020/02/05 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
python安装及变量名介绍详解
2020/12/12 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
毕业生多媒体设计求职信
2013/10/12 职场文书
自我评价怎么写正确呢?
2013/12/02 职场文书
婚前协议书怎么写
2014/04/15 职场文书
村级换届选举方案
2014/05/10 职场文书
社会学专业求职信
2014/07/17 职场文书
教师节学生演讲稿
2014/09/03 职场文书
2014年人事专员工作总结
2014/11/19 职场文书
团员年度个人总结
2015/02/26 职场文书
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS
MySQL事务的隔离级别详情
2022/07/15 MySQL