写一个Vue Popup组件


Posted in Javascript onFebruary 25, 2019

组件长这样

主要有标题、内容、按钮个数、按钮颜色、按钮文案这些可配置项

写一个Vue Popup组件

写一个Vue Popup组件

期望的调用方式一

不需要等待用户二次确认

import Modal from 'common/components/modal'

handleModal() {
 Modal({
  title: '赚取收益?',
  content: '根据您的授权金额和计息天数计算得出(还未到账)。实际以到账金额为准。',
  confirmText: '我知道了'
 })
}

期望的调用方式二

需要等待用户二次确认

import Modal from 'common/components/modal'

async handleModal() {
 await Modal({
  title: '确定现在申请结束吗?',
  content: '申请后预计1-5个工作日可退出',
  cancelColor: '#ff7400',
  confirmColor: '#000',
  showCancel: true
 })
}

模板长这样

common/components/modal/modal.vue

这里用 transition 来包裹动画,填好配置参数就行了

handleConfirm() 二次确认事件我们不放这里实现,具体原因后面会讲
<template>
 <transition name="modal-pop">

  <div class="wrap"
     v-show="visible">

   <div class="modal">

    <h3>{{ title }}</h3>

    <p>{{ content }}</p>

    <div class="btns">
     <span v-if="showCancel"
        @click="visible = false"
        :style="`color: ${cancelColor}`">{{ cancelText }}</span>
     <span @click="handleConfirm()"
        :style="`color: ${confirmColor}`">{{ confirmText }}</span>
    </div>

   </div>

  </div>

 </transition>
</template>

<style lang="less">
@import './modal.less';
</style>

定义好 props 参数列表,visible 作为组件内部状态控制弹框打开关闭

export default {
 props: [
  'title',
  'content',
  'showCancel',
  'cancelColor',
  'cancelText',
  'confirmText',
  'confirmColor'
 ],

 data() {
  return {
   visible: false
  }
 }
}

组件包装

common/components/modal/index.js

先利用 vue 的 extend 拿到刚编写的模板

import Vue from 'vue'

const ModalConstructor = Vue.extend(require('./modal.vue'))

const Modal = (opts = {}) => {
 let _m = new ModalConstructor({ el: document.createElement('div') })
}

export default Modal

配置好默认参数,并将 visible 状态打开以显示弹框,最终插入页面

import Vue from 'vue'

const ModalConstructor = Vue.extend(require('./modal.vue'))

const Modal = (opts = {}) => {
 let _m = new ModalConstructor({ el: document.createElement('div') })

 _m.title = opts.title || '提示'
 _m.content = opts.content || ''
 _m.showCancel = opts.showCancel || false
 _m.cancelText = opts.cancelText || '取消'
 _m.cancelColor = opts.cancelColor || '#000'
 _m.confirmText = opts.confirmText || '确定'
 _m.confirmColor = opts.confirmColor || '#ff7400'
 _m.visible = true

 document.body.appendChild(_m.$el)
}

export default Modal

用户点击二次确认事件后,为了方便组件外部捕捉,这里使用 Promise 包装回调事件

这样 handleConfirm() 放在这里实现是不是就方便很多了
import Vue from 'vue'

const ModalConstructor = Vue.extend(require('./modal.vue'))

const Modal = (opts = {}) => {
 let _m = new ModalConstructor({ el: document.createElement('div') })

 _m.title = opts.title || '提示'
 _m.content = opts.content || ''
 _m.showCancel = opts.showCancel || false
 _m.cancelText = opts.cancelText || '取消'
 _m.cancelColor = opts.cancelColor || '#000'
 _m.confirmText = opts.confirmText || '确定'
 _m.confirmColor = opts.confirmColor || '#ff7400'
 _m.visible = true

 document.body.appendChild(_m.$el)

 return new Promise(resolve => {
  return (_m.handleConfirm = () => {
   _m.visible = false
   resolve()
  })
 })
}

export default Modal

最终长这样

import Modal from 'common/components/modal'

async handleModal() {
 await Modal({
  title: '确定现在申请结束吗?',
  content: '申请后预计1-5个工作日可退出',
  cancelColor: '#ff7400',
  confirmColor: '#000',
  showCancel: true
 })

 console.log('用户确认了!')
}

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

Javascript 相关文章推荐
利用jquery操作Radio方法小结
Oct 20 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
Jan 18 Javascript
通过jquery实现页面的动画效果(实例代码)
Sep 18 Javascript
纯原生js实现table表格的增删
Jan 05 Javascript
vue-router实现webApp切换页面动画效果代码
May 25 Javascript
Angular中自定义Debounce Click指令防止重复点击
Jul 26 Javascript
Angular5.1新功能分享
Dec 21 Javascript
Vue表单输入绑定的示例代码
Nov 01 Javascript
vue代码分割的实现(codesplit)
Nov 13 Javascript
JS温故而知新之变量提升和时间死区
Jan 27 Javascript
validform表单验证的实现方法
Mar 08 Javascript
vue大型项目之分模块运行/打包的实现
Sep 21 Javascript
利用Webpack实现小程序多项目管理的方法
Feb 25 #Javascript
JavaScript中构造函数与原型链之间的关系详解
Feb 25 #Javascript
JavaScript中的事件与异常捕获详析
Feb 24 #Javascript
Vue 组件注册实例详解
Feb 23 #Javascript
Vue Prop属性功能与用法实例详解
Feb 23 #Javascript
Vue自定义属性实例分析
Feb 23 #Javascript
Vue动态组件与异步组件实例详解
Feb 23 #Javascript
You might like
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
javascript 表单验证常见正则
2009/09/28 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
Python文件夹与文件的操作实现代码
2014/07/13 Python
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
python实现根据图标提取分类应用程序实例
2014/09/28 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
详解python中asyncio模块
2018/03/03 Python
一百多行python代码实现抢票助手
2018/09/25 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
LINUX下线程,GDI类的解释
2012/04/17 面试题
材料采购员岗位职责
2015/04/03 职场文书
冰雪公主观后感
2015/06/16 职场文书
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
SQL Server使用导出向导功能
2022/04/08 SQL Server