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 相关文章推荐
如何让div span等元素能响应键盘事件操作指南
Nov 13 Javascript
判断一个对象是否为jquery对象的方法
Mar 12 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
深入分析javascript中console命令
Aug 14 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
Mar 15 Javascript
使用ES6语法重构React代码详解
May 09 Javascript
angular实现页面打印局部功能的思考与方法
Apr 13 Javascript
JS实现HTML页面中动态显示当前时间完整示例
Jul 30 Javascript
jQuery实现图片简单轮播功能示例
Aug 13 jQuery
Bootstrap4 gulp 配置详解
Jan 06 Javascript
vue实现文件上传读取及下载功能
Nov 17 Javascript
vue router-link 默认a标签去除下划线的实现
Nov 06 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高级编程-函数-郑阿奇
2011/07/04 PHP
基于php-fpm的配置详解
2013/06/03 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
python实现中文输出的两种方法
2015/05/09 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
利用Python爬取可用的代理IP
2016/08/18 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
python实现小球弹跳效果
2019/05/10 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
计算机专业毕业生自荐信范文
2014/03/06 职场文书
化妆品活动策划方案
2014/05/23 职场文书
公司门卫岗位职责
2015/04/13 职场文书
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang
Django显示可视化图表的实践
2021/05/10 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python