1+ <template >
2+ <div class =" ActionSheet" >
3+ <transition name =" fade" >
4+ <div v-if =" actionSheet.isShow" @click =" closeMask" class =" Action_mask" ></div >
5+ </transition >
6+ <transition name =" animation" >
7+ <div v-if =" actionSheet.isShow" class =" Action_wrap" >
8+ <div
9+ class =" menu_cell"
10+ v-for =" item of actionSheet.menu"
11+ v-html =" item.content"
12+ @click =" reaction(item.label)"
13+ ></div >
14+ <div v-if =" cancelMode" @click =" hide" class =" menu_cell cancel" >取消</div >
15+ </div >
16+ </transition >
17+ </div >
18+ </template >
19+
20+ <script >
21+ export default {
22+ /**
23+ * 使用:
24+ * 1.必须传一个props:'actionSheet',对象,包括:isShow,menu等键值
25+ * menu是一个数组,数组项必须是一个对象,必须有两个键值对,label和content。
26+ * 1.label必须为字符串,当label为title时,表示是actionSheet的标题,此时不返回emit事件,
27+ * 如果不为title,label的值就是返回的emit事件名称
28+ * 2.content可以为字符串也可以是html标签,表示actionSheet每一项的内容。
29+ * isShow必须是布尔值
30+ * 2.可选一个closeOnClickModal,布尔值,默认false,是否通过点击mask关闭弹窗
31+ * 3.可选一个cancelMode,布尔值,默认false,是否显示'取消'菜单项
32+ * 4.自定义cancel事件,只有在cancelMode为true才有效
33+ * 表示当actionSheet组件点击'取消'菜单项的操作,组件本身会关闭弹窗然后传递给父组件事件
34+ * 其余菜单项的自定义事件名称由menu中每个对象的label决定,例如:
35+ * label:'del',只需要在父组件上添加@del即可接受点击'del'菜单项返回的事件
36+ *
37+ */
38+ name: ' ActionSheet' ,
39+ props: {
40+ cancelMode: {
41+ type: Boolean ,
42+ default: false
43+ },
44+ actionSheet: {
45+ type: Object ,
46+ required: true
47+ },
48+ closeOnClickModal: {
49+ type: Boolean ,
50+ default: false
51+ }
52+ },
53+ methods: {
54+ hide (){
55+ this .actionSheet .isShow = false ;
56+ this .$emit (' cancel' )
57+ },
58+ closeMask (){
59+ if (this .closeOnClickModal ){
60+ this .actionSheet .isShow = false
61+ }
62+ },
63+ reaction (name ){
64+ if (name != ' title' ){
65+ this .actionSheet .isShow = false ;
66+ this .$emit (name)
67+ }
68+ }
69+ }
70+ }
71+ </script >
72+
73+ <style scoped>
74+ .fade-enter-active ,.fade-leave-active {
75+ transition : all .35s ;
76+ }
77+ .fade-enter ,.fade-leave-to {
78+ opacity : 0 ;
79+ }
80+ .animation-enter-active ,.animation-leave-active {
81+ transition : all .35s ;
82+ }
83+ .animation-enter ,.animation-leave-to {
84+ transform : translate3d (0 ,100% ,0 );
85+ }
86+
87+ .Action_mask {
88+ position : fixed ;
89+ z-index : 3 ;
90+ top : 0 ;
91+ left : 0 ;
92+ right : 0 ;
93+ bottom : 0 ;
94+ background : rgba (0 , 0 , 0 , .7 );
95+ }
96+ .Action_wrap {
97+ position : fixed ;
98+ left : 0 ;
99+ bottom :0 ;
100+ z-index : 100 ;
101+ width : 100% ;
102+ background : #fff ;
103+ box-sizing : border-box ;
104+ }
105+ .menu_cell {
106+ padding : .22rem 0 ;
107+ text-align : center ;
108+ font-size : .35rem ;
109+ color : #000 ;
110+ border-top : .04rem solid #EFEFF4 ;
111+ }
112+ .cancel {
113+ border-top : .12rem solid #EFEFF4 ;
114+ }
115+ </style >
0 commit comments