基于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 相关文章推荐
JavaScript 学习笔记(四)
Dec 31 Javascript
动态获取复选框checkbox选中个数的jquery代码
Jun 25 Javascript
二叉树先序遍历的非递归算法具体实现
Jan 09 Javascript
jQuery中$.click()无效问题分析
Jan 29 Javascript
jquery分割字符串的方法
Jun 24 Javascript
jQuery打字效果实现方法(附demo源码下载)
Dec 18 Javascript
JS判断元素是否在数组内的实现代码
Mar 30 Javascript
Bootstrap3学习笔记(二)之排版
May 20 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
Oct 14 jQuery
vue 微信授权登录解决方案
Apr 10 Javascript
JS实现简易留言板(节点操作)
Mar 16 Javascript
elementui实现预览图片组件二次封装
Dec 29 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上传文件时自动分配路径的方法
2015/01/09 PHP
php防止sql注入简单分析
2015/03/18 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
一起深入理解js中的事件对象
2021/02/06 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
Python while 循环使用的简单实例
2016/06/08 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
使用TFRecord存取多个数据案例
2020/02/17 Python
基于python 取余问题(%)详解
2020/06/03 Python
python字典按照value排序方法
2020/12/28 Python
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
大学生就业自荐信
2013/10/26 职场文书
水果连锁超市创业计划书
2014/01/24 职场文书
迎新晚会邀请函
2014/02/01 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
2015年领班工作总结
2015/04/29 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书