写一个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 相关文章推荐
js 中 document.createEvent的用法
Aug 29 Javascript
jQuery实现精美的多级下拉菜单特效
Mar 14 Javascript
jQuery+html5实现div弹出层并遮罩背景
Apr 15 Javascript
JS实现生成会变大变小的圆环实例
Aug 05 Javascript
AngularJS中$interval的用法详解
Feb 02 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
JS实现微信弹出搜索框 多条件查询功能
Dec 13 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
Aug 08 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
May 07 Javascript
微信小程序实现签字功能
Dec 23 Javascript
vue+canvas实现拼图小游戏
Sep 18 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
Jan 19 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 函数执行效率的小比较
2010/10/17 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
2015/03/13 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
python通过yield实现数组全排列的方法
2015/03/18 Python
Python with用法实例
2015/04/14 Python
详解Python核心对象类型字符串
2018/02/11 Python
儿童学习python的一些小技巧
2018/05/27 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
python对html过滤处理的方法
2018/10/21 Python
python实现画图工具
2020/08/27 Python
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
大学生优秀团员事迹材料
2014/01/30 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
计划生育证明格式范本
2014/09/12 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
企业年会祝酒词
2015/08/11 职场文书
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js
Redis三种集群模式详解
2021/10/05 Redis