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 对象模型 执行模型
Oct 15 Javascript
jquery处理json数据实例分析
Jun 03 Javascript
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
Jan 12 Javascript
Boostrap入门准备之border box
May 09 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
Jan 04 Javascript
React教程之封装一个Portal可复用组件的方法
Jan 02 Javascript
Vue resource三种请求格式和万能测试地址
Sep 26 Javascript
jquery使用FormData实现异步上传文件
Oct 25 jQuery
使用JavaScript解析URL的方法示例
Mar 01 Javascript
JavaScript使用canvas绘制随机验证码
Feb 17 Javascript
JS数组方法reduce的用法实例分析
Mar 03 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
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
jQuery表单元素选择器代码实例
2017/02/06 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
在Python中编写数据库模块的教程
2015/04/29 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
浅谈Django REST Framework限速
2017/12/12 Python
详解Django的CSRF认证实现
2018/10/09 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
本科生求职简历的自我评价
2013/10/21 职场文书
大学生活学习的自我评价
2013/12/03 职场文书
预备党员思想汇报
2014/01/08 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
电台编导求职信
2014/05/06 职场文书
党建目标管理责任书
2014/07/25 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
党员个人对照检查材料
2014/10/01 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
会计求职简历自我评价
2015/03/10 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书
Python实现滑雪小游戏
2021/09/25 Python
正则表达式拆分url实例代码
2022/02/24 Java/Android
mysql 获取时间方式
2022/03/20 MySQL