最近在使用element-ui框架,用到了Dialog对话框组件,大体实现的效果,跟我以前本身在移动端项目里面弄的一个弹窗组件差不太多。而后就想着把这种弹窗组件的实现方式与你们分享一下,下面本文会带着你们手摸手实现一个弹窗组件。css
本文主要内容会涉及到弹窗遮罩的实现,slot
插槽的使用方式,props
、$emit
传参,具体组件代码也传上去了。若是喜欢的话能够点波赞/关注,支持一下,但愿你们看完本文能够有所收获。html
我的博客了解一下:obkoro1.comvue
slot
插槽接受从父组件那里传过来弹窗内容。props
接收从父组件传过来的弹窗宽度,上下左右的位置。props
控制组件的显示与隐藏,子组件关闭时经过事件$emit
触发父组件改变值。html结构:一层遮罩层,一层内容层,内容层里面又有一个头部title和主体内容和一个关闭按钮。git
下面是组件中的html结构,里面有一些后面才要加进去的东西,若是看不懂的话能够先跳过,github
<template>
<div class="dialog">
<!--外层的遮罩 点击事件用来关闭弹窗,isShow控制弹窗显示 隐藏的props-->
<div class="dialog-cover back" v-if="isShow" @click="closeMyself"></div>
<!-- transition 这里能够加一些简单的动画效果 -->
<transition name="drop">
<!--style 经过props 控制内容的样式 -->
<div class="dialog-content" :style="{top:topDistance+'%',width:widNum+'%',left:leftSite+'%'}" v-if="isShow">
<div class="dialog_head back">
<!--弹窗头部 title-->
<slot name="header">提示信息</slot>
</div>
<div class="dialog_main" :style="{paddingTop:pdt+'px',paddingBottom:pdb+'px'}">
<!--弹窗的内容-->
<slot name="main">弹窗内容</slot>
</div>
<!--弹窗关闭按钮-->
<div class="foot_close" @click="closeMyself">
<div class="close_img back"></div>
</div>
</div>
</transition>
</div>
</template>
复制代码
下面是组件中的主要的css样式,里面都作了充分的注释,主要经过z-index
和background
达到遮罩的效果,具体内容的css能够根据本身的需求来设置。web
<style lang="scss" scoped>
// 最外层 设置position定位
.dialog {
position: relative;
color: #2e2c2d;
font-size: 16px;
}
// 遮罩 设置背景层,z-index值要足够大确保能覆盖,高度 宽度设置满 作到全屏遮罩
.dialog-cover {
background: rgba(0,0,0, 0.8);
position: fixed;
z-index: 200;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
// 内容层 z-index要比遮罩大,不然会被遮盖,
.dialog-content{
position: fixed;
top: 35%;
// 移动端使用felx布局
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
z-index: 300;
}
</style>
复制代码
slot
定制弹窗内容这一步,只要理解了slot
的做用以及用法,就没有问题了。element-ui
<slot>这是在没有slot传进来的时候,才显示的弹窗内容</slot>
复制代码
上面是单个插槽也叫默认插槽,在父组件中使用插槽的正确姿式:数组
<my-component>
<!--在my-component里面的全部内容片断都将插入到slot所在的DOM位置,而且会替换掉slot标签-->
<!--这两个p标签,将替换整个slot标签里面的内容-->
<p>这是一些初始内容</p>
<p>这是更多的初始内容</p>
</my-component>
复制代码
ps:若是子组件里面包含slot
插槽,那么上面的p标签的内容将会被丢弃。框架
所谓的具名插槽,即为slot
标签赋一个name
属性,具名插槽能够父组件中不一样的内容片断放到子组件的不一样地方,具名插槽仍是能够拥有一个默认插槽。下面能够看一下弹窗组件插槽的使用方式:ide
<div class="dialog_head back ">
<!--弹窗头部 title-->
<slot name="header">提示信息</slot>
</div>
<div class="dialog_main " :style="{paddingTop:pdt+'px',paddingBottom:pdb+'px'}">
<!--弹窗的内容-->
<slot name="main">弹窗内容</slot>
</div>
复制代码
在父组件中的使用方式:
将弹窗组件引入要使用的组件中,并经过components
注册成为组件。
父组件中弹窗组件插槽的使用方法以下。
<dialogComponent>
<div slot="header">插入到name为header的slot标签里面</div>
<div class="dialog_publish_main" slot="main">
这里是内容插入到子组件的slot的name为main里面,能够在父组件中添加class定义样式,事件类型等各类操做
</div>
</dialogComponent>
复制代码
关于组件中用到的插槽的介绍就到这里了,插槽在弹窗组件中的应用是一个典型的栗子,能够看到插槽做用至关强大,而插槽自己的使用并不难,同窗们爱上插槽了没有?
props
控制弹窗显隐&&定制弹窗stylepsops
是Vue中父组件向子组件传递数据的一种方式,不熟悉的小伙伴们能够看一下props文档。
由于弹窗组件都是引到别的组件里面去用的,为了适合不一样组件场景中的弹窗,因此弹窗组件必须具有必定的可定制性,不然这样的组件将毫无心义,下面介绍一下props的使用方式,以弹窗组件为例:
首先须要在被传入的组件中定义props的一些特性,验证之类的。
而后在父组件中绑定props数据。
<script>
export default {
props: {
isShow: {
//弹窗组件是否显示 默认不显示
type: Boolean,
default: false,
required:true, //必须
},
//下面这些属性会绑定到div上面 详情参照上面的html结构
// 如: :style="{top:topDistance+'%',width:widNum+'%'}"
widNum:{
//内容宽度
type: Number,
default:86.5
},
leftSite:{
// 左定位
type: Number,
default:6.5
},
topDistance: {
//top上边距
type: Number,
default:35
},
pdt:{
//上padding
type: Number,
default:22
},
pdb:{
//下padding
type: Number,
default:47
}
},
}
</script>
复制代码
父组件中使用方式:
<dialogComponent :is-show="status.isShowPublish" :top-distance="status.topNum">
</dialogComponent>
复制代码
ps:props传递数据不是双向绑定的,而是单向数据流,父组件的数据变化时,也会传递到子组件中,这就意外着咱们不该该在子组件中修改props。因此咱们在关闭弹窗的时候就须要经过$emit
来修改父组件的数据,而后数据会自动传到子组件中。
如今基本上弹窗组件都已实现的差很少了,还差一个弹窗的关闭事件,这里就涉及到子组件往父组件传参了。
$emit
触发父组件事件修改数据,关闭弹窗Vue中在子组件往父组件传参,不少都是经过$emit
来触发父组件的事件来修改数据。
在子组件中,在点击关闭,或者遮罩层的时候触发下面这个方法:
methods: {
closeMyself() {
this.$emit("on-close");
//若是须要传参的话,能够在"on-close"后面再加参数,而后在父组件的函数里接收就能够了。
}
}
复制代码
父组件中的写法:
<dialogComponent :is-show="status.isShowPublish" :top-distance="status.topNum" @on-close="closeDialog">
</dialogComponent>
//"on-close是监听子组件的时间有没有触发,触发的时候执行closeDialog函数
methods:{
closeDialog(){
// this.status.isShowPublish=false;
//把绑定的弹窗数组 设为false便可关闭弹窗
},
}
复制代码
能够用弹窗组件实现下列这种信息展现,或者事件交互:
上面是把弹窗的每一个步骤拆分开来,一步步解析的,每一步都说的比较清楚了,具体连起来的话,能够看看代码,再结合文章就能理的很清楚了。
这个弹窗组件,实现起来一点都不难,我这里主要是提供了一个实现方式,当项目中有须要的话,你们也能够本身撸一个出来,以上就是本文的内容了,但愿同窗们看完能有所收获。
最后:如需转载,请放上原文连接并署名。码字不易,感谢支持!本人写文章本着交流记录的心态,写的很差之处,不撕逼,可是欢迎指点。
以上2018.4.21