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 相关文章推荐
javascript 异常处理使用总结
Jun 21 Javascript
Extjs ajax同步请求时post方式参数发送方式
Aug 05 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
Apr 11 Javascript
浅析document.ready和window.onload的区别讲解
Dec 18 Javascript
JS图片定时翻滚效果实现方法
Jun 21 Javascript
JavaScript实现鼠标点击导航栏变色特效
Feb 08 Javascript
简单实现js拖拽效果
Jul 25 Javascript
微信小程序定位当前城市的方法
Jul 19 Javascript
使用webpack构建应用的方法步骤
Mar 04 Javascript
微信小程序实现购物车代码实例详解
Aug 29 Javascript
如何基于javascript实现贪吃蛇游戏
Feb 09 Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 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下过滤HTML代码的函数
2007/12/10 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
在 Node.js 中使用原生 ES 模块方法解析
2017/09/19 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
vue组件是如何解析及渲染的?
2021/01/13 Vue.js
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
Python内置函数及功能简介汇总
2020/10/13 Python
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
小学教学随笔感言
2014/02/26 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
解除劳动合同协议书
2014/09/17 职场文书
大学生团员个人总结
2015/02/14 职场文书
2015年新学期寄语
2015/02/26 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
德生2P3收音机开箱评测
2022/04/30 无线电