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 相关文章推荐
让您的菜单不离网站
Oct 03 Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
Mar 22 Javascript
JavaScript 三种不同位置代码的写法
Oct 25 Javascript
Jquery调用webService远程访问出错的解决方法
May 21 Javascript
JavaScript Chart 插件整理
Jun 18 Javascript
表格奇偶行设置不同颜色的核心JS代码
Dec 24 Javascript
Bootstrap select下拉联动(jQuery cxselect)
Jan 04 Javascript
Vue组件选项props实例详解
Aug 18 Javascript
vue基于两个计算属性实现选中和全选功能示例
Feb 08 Javascript
node.js ws模块搭建websocket服务端的方法示例
Apr 25 Javascript
原生JS使用Canvas实现拖拽式绘图功能
Jun 05 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 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
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
Angular组件化管理实现方法分析
2017/03/17 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
python字符串格式化方式解析
2019/10/19 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
Sephora丝芙兰马来西亚官方网站:国际化妆品购物
2018/03/15 全球购物
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
小学教师的个人自我鉴定
2013/10/24 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
网上蛋糕店创业计划书
2014/01/24 职场文书
法制报告会主持词
2014/04/02 职场文书
重阳节简报
2015/07/20 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android
Python first-order-model实现让照片动起来
2022/06/25 Python