基本结构很简单,稍微注意一点的就是 slot插槽,如果没有提供name属性,它将有一个隐含的名字default,并且在父组件如果没有指定 slot的 v-slot属性的话,内容会传给default插槽。
虽然还是不太美观,但是已经基本上是一个弹出框的雏形了,并且我没有给 a标记样式,原因在后面。
SCSS函数
回过头再看看上面的 css代码,这里重复写了4次固定定位的代码,而且随着项目的推进,肯定还有更多类似的代码,何不将这些部分抽取出来,进行封装呢? scss提供了这个功能,将 css封装成函数,这里的函数直接会返回函数体。我们在遇到类似的情况时,就能够直接复用。
在 assets目录下新建 scss文件夹并在里面新建 mixin.scss,在里面新建 position函数,代码如下:
@mixinposition($pos:absolute,$top:0,$left:0,$w:100%,$h:100%){
position:$pos;
top:$top;
left:$left;
width:$w;
height:$h;
}
接着我们引入 mixin.scss,用 position函数替换我们原先的代码
通过@include方式使用 scss函数: @includeposition(fixed);括号里面的是参数。
关于按钮
每一个网站都有很多按钮,不过,同一个网站的按钮风格大多都是一样,无非是大小不一。因此可以单独在 scss文件下新建 button.scss然后在 App.vue里面引入这个文件,在后面除了一些特别的样式,其它就不需要给按钮定义样式了,这样也便于维护。这里给出我的 button文件,可以参考一下。
.btn{
display:inline-block;
width:110px;
line-height:30px;
text-align:center;
background-color:#FF6600;
color:#ffffff;
border:none;
cursor:pointer;
}
.btn-default{
background-color:#b0b0b0;
color:#d7d7d7;
}
.btn-large{
width:202px;
height:50px;
line-height:50px;
font-size:18px;
}
.btn-huge{
width:300px;
height:54px;
line-height:54px;
font-size:16px;
}
.btn-group{
.btn{
margin-right:20px;
&:last-child{
margin-right:0;
}
}
}
为了复用
当前这个弹出框还只是一个固定的结构,它并不能在其他地方复用,需要进行一些处理,将所有可变部分抽取出来,例如标题,按钮,内容。因为有插槽,所以内容就不用考虑,需要关注的是标题和按钮,因为标题有可能是提示,警告等等,按钮也有可能是确定、取消的一个或两个都有。而这些信息都是从父组件传递过来,需要用 props接收。
在 props里面添加如下代码,并给某些属性指定默认值:
props:{
//弹框标题
title:String,
//按钮类型:1:确定按钮2:取消按钮3:确定取消
btnType:String,
//按钮文本
sureText:{
type:String,
default:"确定"
},
cancleText:{
type:String,
default:"取消"
},
showModal:Boolean
}
添加完之后,还需重新改写代码
{{title}}
{{cancleText}}
{{sureText}}
{{cancleText}}
通过父组件传递的参数,来实现代码的重用,并且使用 $emit来向外抛出自定义事件,然后在父组件实现自己的业务逻辑。
在 Home.vue里面引入这个组件并调用
给个小星星吧
这里的 @submit和 @cancle就是我们在组件里面自定义的事件
最终效果如下
实现完之后,感觉有点弹出时生硬,没关系,我们给它加点动画,在css3中有 transform和 transition可以实现动画效果,但是我们这里使用 vue内置组件 ,让弹出框有一个从上面弹出的效果。
transition组件
transition组件可以为元素或组件添加过渡效果,只会把过渡效果应用到其包裹的内容上,而不会额外渲染DOM元素,也不会出现在可被检查的组件层级中。它可以通过多种方式进行过渡,在这里应用class的方式过渡。
这幅图是 Vue官方给出的图,简单来说,v-enter是动画开始的状态,v-enter-active进入过渡生效时的状态,v-enter-to是过渡的结束状态,leave同理,具体细节大家可以去 https://cn.vuejs.org/v2/guide/transitions.html查看。
当没有指定的name属性时,过渡的类名会默认以v作为前缀,这里给transition指定name为
slide并用它包裹modal组件
...
...
在style代码里面modal后面加上
&.slide-enter-active{
top:0;
}
&.slide-leave-active{
top:-100%;
}
&.slide-enter{
top:-100%;
}
并且给modal指定需要过渡的属性
transition:top0.5s;
加完这个之后,弹出框就会有一个滑上滑下的动画啦。
到此,我们的弹出框就完成啦。
你也可以根据自己的需求去做适当的调整,开发出适合自己项目的弹出框。
最后
在实际开发中,组件化是尤为重要的,它能够帮助我们写出更高质量的代码,也能够让我们的代码更易于维护,尽早的树立组件化的思想,对写代码也是非常有帮助的。
附上https://github.com/anpeier/shop-online
到此这篇关于Vue组件化开发之通用型弹出框的实现的文章就介绍到这了,更多相关Vue弹出框内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。