vue-dialog的弹出层组件


Posted in Javascript onMay 25, 2020

本文章通过实现一个vue-dialog的弹出层组件,然后附加说明如果发布此包到npm,且能被其他项目使用。

功能说明

多层弹出时,只有一个背景层。
弹出层嵌入内部组件。
弹出层按钮支持回调
源码下载

实现

vue-dialog的弹出层组件

多层弹出时,只有一个背景层

利用两个组件实现,一个背景层组件(只提供一个背景层,组件名:background.vue),一个弹出层内容管理组件(实现多个内容层的管理,组件名:master.vue)。

弹出层嵌入内部组件

使用vue的component组件实现,他可以完美支持。

弹出层按钮支持回调

在master.vue中实现,详细解析此代码

html代码

<template>
 <div> 
 <div class="modal-content" v-for="(comp,index) in comps" v-bind:style="style(index,comp)" >
 <div class="modal-header" >
 header
 </div>
 <div class="modal-body">
 <component :is="comp"></component>
 </div>
 <div class="modal-footer">
 <button type="button" class="btn btn-default" v-on:click="clickHandler(btn.value, comp, index)" v-for="btn in btns" >{{btn.text}}</button>
 </div>
 </div> 
 <hDialogBack ref="back" v-bind:z-index="realIndex-1" ></hDialogBack>
 </div>
</template>

comps:内部组件的集合
realIndex:一个computed属性,读取props的mIndex属性,表示内部层的zIndex层级关系。
component加载组件
btns:表示按钮的集合,现还不支持组件独立配置按钮列表。
style:此方法用于生成内部组件居中的css代码。

js代码:

<script>
import hDialogBack from './background'

function getclientPoint () {
 return {
 width: document.documentElement.clientWidth || document.body.clientWidth,
 height: document.documentElement.clientHeight || document.body.clientHeight
 }
}

export default {
 name: 'HDialog',
 data () {
 return {
 comps: []
 }
 },
 props: {
 'btns': {
 type: Array,
 default: function () {
 return [{ text: 'ok', value: 'ok'}, { text: 'cancel', value: 'cancel'}]
 }
 },
 'mIndex': {
 type: Number,
 default: 19861016
 }
 },
 computed: {
 realIndex: function () {
 return this.mIndex
 }
 },
 components: {
 hDialogBack
 },
 methods: {
 open: function (comp) {
 comp.promise = new Promise(function (resolve, reject) {
 comp.resolve = resolve
 comp.reject = reject
 })
 comp.width = comp.width || 600
 comp.height = comp.height || 400
 this.comps.push(comp)
 if (!this.$refs.back.show) {
 this.$refs.back.open()
 }
 return comp.promise
 },
 clickHandler: function (type, comp, index) {
 let self = this
 let close = function () {
 self.comps.splice(index, 1)
 if (self.comps.length === 0 && self.$refs.back.show) {
 self.$refs.back.close()
 }
 }
 /** 只提供promise模式 */
 comp.resolve({'type': type, 'close': close})
 },
 style: function (index, comp) {
 let point = getclientPoint()
 return {
 zIndex: this.realIndex + index,
 width: comp.width + 'px',
 height: comp.height + 'px',
 left: ((point.width - comp.width) / 2) + 'px',
 top: ((point.height - comp.height) / 2) + 'px'
 }
 }
 }
}
</script>

open方法,用于打开弹出层,且返回一个Promise。

嵌入background.vue组件,用于提供背景层。

clickHandler方法:master.vue组件按钮的事件响应函数,会resolve在open方法中提供的promise。

css代码:

<style>
.modal-content {
 position: absolute;
}
</style>

如何实用

首先需要在顶层引入master.vue,然后嵌入到与app组件平级,如下代码:

new Vue({
 el: '#app',
 template: '<div><App></App><HDialog ref="hDialog" ></HDialog></div>',
 components: { App }
})

一定要指定ref值,这是弹出层实现的关键。

在任意一个子组件中如下使用:

let promise = this.$root.$refs.hDialog.open({
 template: '<div>第二层了</div>'
 })
 promise.then(function (arg) {
 alert('第二层' + arg.type)
 arg.close()
})

使用$root.$refs找到弹出层管理组件

使用调用其open方法,并接受一个promise类型的返回值

使用promise即可。

发布到npm

如果组件需要被其他人引用,最好使用commonjs2规范,webapck如下配置:

output: {
path: './dist',
filename: '[name].js',
library: 'vue-hdialog',
libraryTarget: 'commonjs2'
}
  • 在npmjs上注册一个账号
  • 利用npm login 登录
  • 使用npm publish 发布,如果你想卸载可以用npm unpublish --force.
  • 发布是需要package.json检测version和name字段,如果已存,或者是存在被卸载的都不行。
  • package.json中的main节点是指定其他引用时,默认导出的文件。

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

更多vue学习教程请阅读专题《vue实战教程》

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

Javascript 相关文章推荐
Javascript中的delete介绍
Sep 02 Javascript
node.js中的http.get方法使用说明
Dec 14 Javascript
javascript折半查找详解
Jan 26 Javascript
jquery实现动态操作select选中
Feb 11 Javascript
js实现简单鼠标跟随效果的方法
Apr 10 Javascript
jQuery 全选 全部选 反选 实现代码
Aug 17 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
Apr 25 jQuery
基于node.js之调试器详解
Aug 22 Javascript
jQuery阻止事件冒泡实例分析
Jul 03 jQuery
详解Axios统一错误处理与后置
Sep 26 Javascript
node中IO以及定时器优先级详解
May 10 Javascript
关于对TypeScript泛型参数的默认值理解
Jul 15 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
Mar 01 #Javascript
基于Bootstrap的网页设计实例
Mar 01 #Javascript
JS中的作用域链
Mar 01 #Javascript
javascript html5轻松实现拖动功能
Mar 01 #Javascript
详解数组Array.sort()排序的方法
May 09 #Javascript
JavaScript中数组Array.sort()排序方法详解
Mar 01 #Javascript
javascript中replace使用方法总结
Mar 01 #Javascript
You might like
typecho插件编写教程(一):Hello World
2015/05/28 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
使用JS读秒使用示例
2013/09/21 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
python处理csv数据的方法
2015/03/11 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
pytorch 预训练层的使用方法
2019/08/20 Python
PageFactory设计模式基于python实现
2020/04/14 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
毕业生自荐信的主要内容
2013/10/29 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
财务人员入职担保书
2015/09/22 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
Oracle 触发器trigger使用案例
2022/02/24 Oracle
centos7安装mysql5.7经验记录
2022/05/02 Servers
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技