Vue.js弹出模态框组件开发的示例代码


Posted in Javascript onJuly 26, 2017

前言

在开发项目的过程中,经常会需要开发一些弹出框效果,但原生的alert和confirm往往都无法满足项目的要求。这次在开发基于Vue.js的读书WebApp的时候总共有两处需要进行提示的地方,因为一开始就没有引入其他的组件库,现在只好自己写一个模态框组件了。目前只是一个仅满足当前项目需求的初始版本,因为这个项目比较简单,也就没有保留很多的扩展功能。这个组件还是有很多扩展空间的,可以增加更多的自定义内容和样式。这里只介绍如何去开发一个模态框组件,有需要进行更多扩展的,可以根据自己的需求自行开发。

组件模板

<template>
<div class="dialog">
 <div class="mask"></div>
 <div class="dialog-content">
  <h3 class="title">{{ modal.title }}</h3>
  <p class="text">{{ modal.text }}</p>
  <div class="btn-group">
   <div class="btn" @click="cancel">{{ modal.cancelButtonText }}</div>
   <div class="btn" @click="submit">{{ modal.confirmButtonText }}</div>
  </div>
 </div>
</div>
</template>

模态框结构分为:头部标题、提示内容和操作区域。同时一般还会有一个遮罩层。此次需求比较简单,也无需图标等内容,所以结构上写的也比较简单。实际开发中可根据需求对结构进行相应的调整。

组件样式

.dialog {
 position: relative;

 .dialog-content {
  position: fixed;
  box-sizing: border-box;
  padding: 20px;
  width: 80%;
  min-height: 140px;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  border-radius: 5px;
  background: #fff;
  z-index: 50002;
  .title {
   font-size: 16px;
   font-weight: 600;
   line-height: 30px;
  }
  .text {
   font-size: 14px;
   line-height: 30px;
   color: #555;
  }
  .btn-group {
   display: flex;
   position: absolute;
   right: 0;
   bottom: 10px;
   .btn {
    padding: 10px 20px;
    font-size: 14px;
    &:last-child {
     color: #76D49B;
    }
   }
  }
 }
 .mask {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  z-index: 50001;
  background: rgba(0,0,0,.5);
 }
}

样式比较简单,就不多说了。

组件接口

export default {
 name: 'dialog',
 props: {
  dialogOption: Object
 },
 data() {
  return {
   resolve: '',
   reject: '',
   promise: '', // 保存promise对象
  }
 },
 computed: {
  modal: function() {
   let options = this.dialogOption;
   return {
    title: options.title || '提示',
    text: options.text,
    cancelButtonText: options.cancelButtonText ? options.cancelButtonText : '取消',
    confirmButtonText: options.confirmButtonText ? options.confirmButtonText : '确定',
   }
  }
 },
 methods: {
  //确定,将promise断定为完成态
  submit() {
   this.resolve('submit');
  },
  // 取消,将promise断定为reject状态
  cancel() {
   this.reject('cancel');
  },
  //显示confirm弹出,并创建promise对象,给父组件调用
  confirm() {
   this.promise = new Promise((resolve, reject) => {
    this.resolve = resolve;
    this.reject = reject;
   });
   return this.promise; //返回promise对象,给父级组件调用
  }
 }

}

在模态框组件中定义了三个方法,核心的方法是confirm,此方法是提供给父级组件调用的,返回一个promise对象。使用promise对象主要是为了异步调用,因为很多时候我们使用模态框时需要根据返回结果再进行下一步处理。

扩展提示:

如果需要扩展的话,可以通过props的dialogOption传递更多的字段,在computed中进行判断,比如增加一个字段isShowCancelButton可以控制取消按钮是否显示。其他扩展同理。

调用

<v-dialog v-show="showDialog" :dialog-option="dialogOption" ref="dialog"></v-dialog>

this.showDialog = true;
this.$refs.dialog.confirm().then(() => {
 this.showDialog = false;
 next();
}).catch(() => {
 this.showDialog = false;
 next();
})

源码地址

Dialog组件源码

实现效果

Vue.js弹出模态框组件开发的示例代码

Vue.js弹出模态框组件开发的示例代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一些不错的js函数ajax
Aug 20 Javascript
jquery 学习之二 属性(类)
Nov 25 Javascript
各浏览器对click方法的支持差异小结
Jul 31 Javascript
一个JS的日期格式化算法示例
Jul 31 Javascript
Jquery解析json字符串及json数组的方法
May 29 Javascript
JavaScript中数据结构与算法(三):链表
Jun 19 Javascript
javascript数组遍历的方法实例分析
Sep 13 Javascript
JavaScript中object和Object的区别(详解)
Feb 27 Javascript
JS字符串与二进制的相互转化实例代码详解
Jun 28 Javascript
layui 实现table翻页滚动条位置保持不变的例子
Sep 05 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
May 23 Javascript
javascript的hashCode函数实现代码小结
Aug 11 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
Jul 26 #Javascript
node实现简单的反向代理服务器
Jul 26 #Javascript
Angular项目中$scope.$apply()方法的使用详解
Jul 26 #Javascript
Vue中计算属性computed的示例解读
Jul 26 #Javascript
让你彻底掌握es6 Promise的八段代码
Jul 26 #Javascript
Bootstrap datepicker日期选择器插件使用详解
Jul 26 #Javascript
js实现图片轮播效果学习笔记
Jul 26 #Javascript
You might like
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
offsetParent 算法分析
2010/04/05 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
Vue js with语句原理及用法解析
2020/09/03 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python兔子毒药问题实例分析
2015/03/05 Python
Python创建系统目录的方法
2015/03/11 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
浅谈css3中的前缀
2016/07/20 HTML / CSS
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
舞会礼服和舞会鞋:PromGirl
2019/04/22 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
什么是唯一索引
2015/07/05 面试题
应急处置方案
2014/06/16 职场文书
医生见习报告范文
2014/11/03 职场文书
2014年学前班工作总结
2014/12/08 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers