小程序自定义弹层组件

Posted grax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小程序自定义弹层组件相关的知识,希望对你有一定的参考价值。

自己用到的,记录一下

1、效果图

2、弹层组件代码

a、js代码

 1 // components/dialog/index.js
 2 Component({
 3   options: {
 4     multipleSlots: true
 5   },
 6   properties: {
 7     //高度
 8     height: {
 9       type: String,
10       value: "60vh"
11     },
12     //标题
13     title: {
14       type: String,
15       value: ""
16     },
17     //是否显示标题
18     showTitle: {
19       type: Boolean,
20       value: false
21     },
22   },
23   data: {
24     show: false, //是否显示
25   },
26   methods: {
27     //隐藏显示
28     show: function(e) {
29 
30       var animation = wx.createAnimation({
31         duration: 200,
32         timingFunction: "linear",
33         delay: 0
34       })
35       animation.translateY(600).step()
36       this.setData({
37         animationData: animation.export(),
38         show: true
39       })
40       setTimeout(function() {
41         animation.translateY(0).step()
42         this.setData({
43           animationData: animation.export()
44         })
45       }.bind(this), 200)
46 
47 
48       return;
49       this.setData({
50         show: true
51       });
52       this.triggerEvent("showCallback");
53     },
54     hidden: function(e) {
55       var animation = wx.createAnimation({
56         duration: 250,
57         timingFunction: "linear",
58         delay: 0
59       })
60       animation.translateY(600).step()
61       this.setData({
62         animationData: animation.export(),
63       })
64       setTimeout(function() {
65         animation.translateY(0).step()
66         this.setData({
67           // animationData: animation.export(),
68           show: false
69         })
70       }.bind(this), 250)
71 
72       return;
73       this.setData({
74         show: false
75       });
76       this.triggerEvent("hideCallback");
77     }
78   }
79 })

b、css代码

 1 @import "/style/iconfont.wxss";
 2 @import "/app.wxss";
 3 
 4 .dialogBg {
 5   width: 100vw;
 6   height: 100vh;
 7   position: fixed;
 8   background: rgba(0, 0, 0, 0.3);
 9   z-index: 1;
10   left: 0;
11   top: 0;
12 }
13 
14 .dialogContent {
15   width: 100vw;
16   height: 60vh;
17   position: fixed;
18   bottom: 0;
19   background: white;
20   z-index: 2;
21   border-top-left-radius: 30rpx;
22   border-top-right-radius: 30rpx;
23   overflow: hidden;
24 }
25 
26 .dialogTitle {
27   height: 70rpx;
28   line-height: 70rpx;
29   text-align: center;
30 }
31 
32 .dialogClose {
33   position: absolute;
34   right: 20rpx;
35   color: #999;
36   line-height: 70rpx;
37   z-index: 2;
38 }
39 
40 .dialogSlot {
41   width: 100%;
42   /* height: 60vh - 70rpx; */
43   overflow-y: scroll;
44 }

c、wxml代码

 1 <view class="dialogBox" wx:if="{{show}}">
 2   <view class="dialogBg" catchtouchmove="return" bindtap="hidden"></view>
 3   <view class="dialogContent" animation="{{animationData}}" style="height:{{height}}">
 4     <view class="dialogTop">
 5       <text class="dialogClose sz szguanbi" bindtap="hidden"></text>
 6       <view wx:if="{{showTitle}}" class="dialogTitle">{{title}}</view>
 7     </view>
 8     <view class="dialogSlot" wx:if="{{showTitle}}" style="height:calc({{height}} - 70rpx)">
 9       <slot name="content"></slot>
10     </view>
11     <view class="dialogSlot" wx:if="{{!showTitle}}" style="height:{{height}}">
12       <slot name="content"></slot>
13     </view>
14   </view>
15 </view>
catchtouchmove:给背景加上此值,可方法弹层中滚动造成背景页面滚动

3、调用方页面相关代码

a、页面json文件引入

1 {
2   "usingComponents": {
3     "paramDialog": "/components/dialog/index",//引入弹层组件
4     "param": "/components/param/index"//此处把弹层内容也独立为一个组件
5   }
6 }

b、wxml相关代码

1 <!-- 弹层+弹层内容两个组件 -->
2 <dialog id="paramDialog" showTitle="{{true}}" title="产品参数" height="60vh">
3   <view slot="content">
4     <param m="{{m}}" bind:hideParamDialog="afterParam" data="{{data}}" id="paramPage"></param>
5   </view>
6 </dialog>
showTitle:是否显示标题
title:标题内容
height:弹层高度
param :传参跟事件相

 c、js相关代码

 1 var app = getApp();
 2 var base = require(\'../../utils/base.js\');
 3 var that;
 4 Page({
 5   data: {   
 6     paramDialog: undefined,
 7     paramPage: undefined
 8   },
 9   onLoad: function(options) {
10     that = this;
11     this.setData({
12         paramDialog: that.selectComponent("#paramDialog"),
13         paramPage: that.selectComponent("#paramPage")
14     });
15   },
16   //关闭参数弹层
17   afterParam: function() {
18     this.data.paramDialog.hidden();
19   },
20   //打开参数弹层
21   openParamDailog: function() {
22     this.data.paramDialog.show();
23   }
24 })
base.js:自己用到的帮助方法库

4、弹层内容组件相关代码

a、wxml代码

//高度减去170rpx为了保持底部确认按钮,如果不需要可以直接是60vh
1
<scroll-view scroll-y="true" catchtouchmove=\'{{true}}\' style="height:calc(60vh - 170rpx);"> 2 3 <view class="page "> 4 5 //自定义内容 6 7 </scroll-view> 8 9 <view class="skuBottom clear"> 10 <view class="skuBottomBox"> 11 <view bindtap="SelectOk">确定</view> 12 </view> 13 </view>

b、css代码

 1 @import "/style/iconfont.wxss";
 2 @import "/app.wxss";
 3 
 4 scroll-view {
 5   background: #fff;
 6 }
 7 
 8 .page {
 9   padding: 20rpx;
10   padding-top: 0;
11 }
12 
13 .skuBottom {
14   width: 100%;
15   height: 100rpx;
16 }
17 
18 .skuBottomBox {
19   width: 100%;
20   height: 100rpx;
21   padding-top: 10rpx;
22   position: fixed;
23   bottom: 0;
24 }
25 
26 .skuBottomBox view {
27   background: #ff0812;
28   width: calc(100% - 40rpx);
29   height: 80rpx;
30   border-radius: 5em;
31   text-align: center;
32   line-height: 80rpx;
33   color: white;
34   font-weight: bold;
35   margin: 0 auto;
36 }
37 
38 .radio .szradio-yes {
39   color: #ff0812;
40 }
41 
42 .radio .szradio-no {
43   color: #999;
44 }

3、js代码

 1 equire(\'../../utils/base.js\');
 2 var that;
 3 Component({
 4   properties: {
 5     m: {
 6       type: Object,
 7       value: {}
 8     }
 9   },
10   data: {},
11   methods: {
12     SelectOk: function() {
13       this.triggerEvent("hideParamDialog");
14     }
15   }
16 })

仅此记录一下,并没有贴出所有代码,请见谅!

以上是关于小程序自定义弹层组件的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序自定义组件详解

polymer框架在代码中动态创建需要支持内容分发的自定义元素并挂载到文档中

小程序的基础(完结)

小程序的基础(完结)

微信小程序自定义组件的使用以及调用自定义组件中的方法

微信小程序[电商]-自定义 Banner(轮播图)组件