vue.js开发实现全局调用的MessageBox组件实例代码


Posted in Javascript onNovember 22, 2017

前言

一开始接触到vue中的组件的时候,对于组件的理解还是不够充分的,最近在开发个人博客项目中,一开始就没准备使用一些现在比较流行的UI库(毕竟是个人项目,多练练手还是好的),所以需要自己开发几个全局组件,这里以MessageBox为例记录下vue.js如何开发全局组件。所谓全局变量是针对vue实例下说的,即所有的vue实际都可以运用到这个组件,局部组件就是针对某个实例来说的,只有这个vue实例下才能发挥作用,下面话不多说了,来一看看详细的介绍吧。

源码

github地址:Talk is cheap. Show me the code.

本地下载地址:http://xiazai.3water.com/201711/yuanma/vue-messagebox(3water.com).rar

组件模板

// /src/components/MessageBox/index.vue
<template>
 <div class="message-box" v-show="isShowMessageBox">
  <div class="mask" @click="cancel"></div>
  <div class="message-content">
  <svg class="icon" aria-hidden="true" @click="cancel">
   <use xlink:href="#icon-delete" rel="external nofollow" ></use>
  </svg>
   <h3 class="title">{{ title }}</h3>
   <p class="content">{{ content }}</p>
  <div>
   <input type="text" v-model="inputValue" v-if="isShowInput" ref="input">
  </div>
   <div class="btn-group">
    <button class="btn-default" @click="cancel" v-show="isShowCancelBtn">{{ cancelBtnText }}</button>
    <button class="btn-primary btn-confirm" @click="confirm" v-show="isShowConfimrBtn">{{ confirmBtnText }}</button>
   </div>
  </div>
 </div>
 </template>
 
 <script>
 export default {
  props: {
  title: {
   type: String,
   default: '标题'
  },
  content: {
   type: String,
   default: '这是弹框内容'
  },
  isShowInput: false,
  inputValue: '',
  isShowCancelBtn: {
   type: Boolean,
   default: true
  },
  isShowConfimrBtn: {
   type: Boolean,
   default: true
  },
  cancelBtnText: {
   type: String,
   default: '取消'
  },
  confirmBtnText: {
   type: String,
   default: '确定'
  }
  },
  data () {
  return {
   isShowMessageBox: false,
   resolve: '',
   reject: '',
   promise: '' // 保存promise对象
  };
  },
  methods: {
  // 确定,将promise断定为resolve状态
  confirm: function () {
   this.isShowMessageBox = false;
   if (this.isShowInput) {
   this.resolve(this.inputValue);
   } else {
   this.resolve('confirm');
   }
   this.remove();
  },
  // 取消,将promise断定为reject状态
  cancel: function () {
   this.isShowMessageBox = false;
   this.reject('cancel');
   this.remove();
  },
  // 弹出messageBox,并创建promise对象
  showMsgBox: function () {
   this.isShowMessageBox = true;
   this.promise = new Promise((resolve, reject) => {
   this.resolve = resolve;
   this.reject = reject;
   });
   // 返回promise对象
   return this.promise;
  },
  remove: function () {
   setTimeout(() => {
   this.destroy();
   }, 300);
  },
  destroy: function () {
   this.$destroy();
   document.body.removeChild(this.$el);
  }
  }
 };
 </script>
 <style lang="scss" scoped>
 // 此处省略 ...
 </style>

给组件添加全局功能

vue.js官方文档中有开发插件的介绍。具体实现代码如下:

// /src/components/MessageBox/index.js

import msgboxVue from './index.vue'; 
// 定义插件对象
const MessageBox = {};
// vue的install方法,用于定义vue插件
MessageBox.install = function (Vue, options) {
 const MessageBoxInstance = Vue.extend(msgboxVue);
 let currentMsg, instance;
 const initInstance = () => {
 // 实例化vue实例
 currentMsg = new MessageBoxInstance();
 let msgBoxEl = currentMsg.$mount().$el;
 document.body.appendChild(msgBoxEl);
 };
 // 在Vue的原型上添加实例方法,以全局调用
 Vue.prototype.$msgBox = {
 showMsgBox (options) {
  if (!instance) {
  initInstance();
  }
  if (typeof options === 'string') {
  currentMsg.content = options;
  } else if (typeof options === 'object') {
  Object.assign(currentMsg, options);
  }
  return currentMsg.showMsgBox();
 }
 };
};
export default MessageBox;

全局使用

// src/main.js
import MessageBox from './components/MessageBox/index';
Vue.use(MessageBox);

页面调用

按照之前定义好的方法,可以在各个页面中愉快的调用该组件了。

this.$msgBox.showMsgBox({
 title: '添加分类',
 content: '请填写分类名称',
 isShowInput: true
}).then(async (val) => {
 // ...  
}).catch(() => {
 // ...
});

最后来张效果图

vue.js开发实现全局调用的MessageBox组件实例代码

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
node.js中的fs.truncate方法使用说明
Dec 15 Javascript
javascript实现checkbox全选的代码
Apr 30 Javascript
JS数组array元素的添加和删除方法代码实例
Jun 01 Javascript
JavaScript返回上一页的三种方法及区别介绍
Jul 04 Javascript
浅析JavaScript Array和string的转换(推荐)
May 20 Javascript
JS实现获取当前URL和来源URL的方法
Aug 24 Javascript
JS针对Array的各种操作汇总
Nov 29 Javascript
jQuery Datatables表头不对齐的解决办法
Nov 27 jQuery
vue实现循环滚动列表
Jun 30 Javascript
基于JS实现计算24点算法代码实例解析
Jul 23 Javascript
八种Vue组件间通讯方式合集(推荐)
Aug 18 Javascript
vue在使用ECharts时的异步更新和数据加载详解
Nov 22 #Javascript
echarts学习笔记之箱线图的分析与绘制详解
Nov 22 #Javascript
解析Vue2 dist 目录下各个文件的区别
Nov 22 #Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
Nov 22 #Javascript
echarts学习笔记之图表自适应问题详解
Nov 22 #Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
Nov 22 #Javascript
在vue中添加Echarts图表的基本使用教程
Nov 22 #Javascript
You might like
来自PHP.NET的入门教程
2006/10/09 PHP
分享PHP入门的学习方法
2007/01/02 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
javascript从作用域链谈闭包
2020/07/29 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
python迭代器实例简析
2014/09/25 Python
Python探索之SocketServer详解
2017/10/28 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
python打开文件的方式有哪些
2020/06/29 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
HEMA法国:荷兰原创设计
2019/02/21 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
房地产管理毕业生自荐信
2013/11/04 职场文书
户外用品商店创业计划书
2014/01/29 职场文书
银行求职信范文
2014/05/26 职场文书
学生打架检讨书
2014/10/20 职场文书
员工规章制度范本
2015/08/07 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
python脚本框架webpy模板控制结构
2021/11/20 Python