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 相关文章推荐
Javascript 的addEventListener()及attachEvent()区别分析
May 21 Javascript
jquery插件之定时查询待处理任务数量
May 01 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
Dec 03 Javascript
JavaScript中的类与实例实现方法
Jan 23 Javascript
JS中作用域和变量提升(hoisting)的深入理解
Oct 31 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
Jul 10 Javascript
关于JavaScript语句后面的分号问题
Dec 07 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
Nov 02 Javascript
Vue+Element-UI实现上传图片并压缩
Nov 26 Javascript
ES6学习笔记之let与const用法实例分析
Jan 22 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
Jul 19 Javascript
JavaScript 事件捕获冒泡与捕获详情
Nov 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中数字0和空值的区别分析
2014/06/05 PHP
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
处理Python中的URLError异常的方法
2015/04/30 Python
Python中使用不同编码读写txt文件详解
2015/05/28 Python
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
python交互式图形编程实例(二)
2017/11/17 Python
Python虚拟环境项目实例
2017/11/20 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
北京SQL新华信咨询
2016/09/30 面试题
自动化专业本科毕业生求职信
2013/10/20 职场文书
教育专业个人求职信
2013/12/02 职场文书
便利店投资创业计划书
2014/02/08 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
《社戏》教学反思
2014/04/15 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
学习计划是什么
2019/04/30 职场文书
python文件与路径操作神器 pathlib
2022/04/01 Python
六个好看实用的 HTML + CSS 后台登录入口页面
2022/04/28 HTML / CSS