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