基于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 相关文章推荐
JS获取iframe中marginHeight和marginWidth属性的方法
Apr 01 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
JavaScipt选取文档元素的方法(推荐)
Aug 05 Javascript
ES6新特性之函数的扩展实例详解
Apr 01 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
Oct 26 Javascript
JavaScript数据结构之单链表和循环链表
Nov 28 Javascript
详解React native fetch遇到的坑
Aug 30 Javascript
vue表单数据交互提交演示教程
Nov 13 Javascript
微信小程序纯文本实现@功能
Apr 08 Javascript
ES6对象操作实例详解
May 23 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
Feb 07 Javascript
js实现验证码干扰(静态)
Feb 22 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
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
EsLint入门学习教程
2017/02/17 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
如何用python免费看美剧
2020/08/11 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
应届生新闻编辑求职信
2013/11/19 职场文书
工程项目经理任命书
2014/06/05 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
走近毛泽东观后感
2015/06/04 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript