在开始分享“微信小程序点击事件”之前,必须要吐糟下。
2018年9月16日,永远会记住这一天,经历了人生的最大台风“山竹”(12级+),呆在家里,感觉房子都在晃动,听到外面鬼谷狼嚎的风叫声,心慌之时带上耳机,在客厅打地铺,蒙头大睡,醒来发现昂还在,突然感悟:活着真好,且活且珍惜,😄。
次日,风已去,雨还在,从家到公司,发现深圳已成为一座“废墟”城,到处都是垃圾,难行走。虽然环境恶劣,上班照常(很多公司今天放假),工作还得做,文章还得继续写,为啥?穷呗。
OK,还是回归正题吧,前段时间有一些网友问到微信小程序里一些问题,其中有个是关于模拟JS中点击事件的,如何去实现。我在这里总结了一些“小程序”常用的点击事件应用,一共分为四种,接下来我们逐个分析。
一、点击选中
点击事件应用,这个是最基本的交互,看一个最简单的实例:默认和点击后的状态。
默认:
点击后
这个在平时的前端交互中,实现起来很简单;但是在微信小程序里,思路是一样的,只是换了一种形式。
WXML代码:
<view class='dati-l-item {{currentTab == 0 ? "stadus" : ""}}' data-current='0' id='A' bindtap="disp"><icon></icon>6月18日</view>
这里估计难理解就是{{currentTab == 0 ? "stadus" : ""}},其实就是两种状态,一种是点击后,我们添加一个样式名stadus,另外一种就是默认的,我们通过stadus去控制点击后的样式。
然后就是bindtap="disp",这个其实就是给这个按钮绑定一个disp事件。
JS代码:
我们先在data里面定义下:
Page({ data{ stadus:'' } })
然后给disp事件赋予一些方法,如下:
disp: function (e){ let this = that; if(xxx){ that.setData({ currentTab: e.currentTarget.dataset.current }) } }
点击后,给currentTab赋值空或者stadus。
这里我也想补充下,因为我最近做了一个答题的小游戏,就是点击后,外面需要自动跳转到下一题,但是需要停顿下后再跳转,实现方法很简单,就是在上面的方法上,再添加一个跳转的方法,然后设置一个定时器。代码如下:
disp: function (e){ let this = that; if(xxx){ that.setData({ currentTab: e.currentTarget.dataset.current }) } // time setTimeout(function () { that.refresh(); }, 500) }
说明:就是点击选中后,0.5S后,直接跳转到下一题,这样是最理想的状态。
二、点击弹出收起模拟JQ中的toggle()
我们知道,jQuery中实现点击弹出收起,最基本的方法就是toggle(),那么在微信小程序里,如何去实现呢,还是拿最近做的一个小程序案例来分析,更简便,易理解。
这是一些默认状态(收起),点击后可以展开内容和收起,然后箭头变化。
方法跟上面提到的有些类似,只是复杂了些,首先来看下wxml:
<view class="guzhi-item {{statusArr[0] ? 'vshow' : 'vhide'}}"> <view class='guzhi-tt' data-index="0" bindtap="bindViewTap"><text class='bold'>SP500</text><text class='dian'></text>标普500</view> <view class="guzhi-down m20 dn">标准普尔500指数是记录美国500家上市公司的一个股票指数,这个股票指数由标准普尔公司创建并维护</view> </view>
这个不去解释了,大家一看就很清楚啦。
JS代码:
Page({ data: { statusArr:false }, bindViewTap: function (e) { let that = this, idx = e.target.dataset.index, updateStatusArr = that.data.statusArr.slice(0); //复制新数组 updateStatusArr[idx] = !that.data.statusArr[idx]; that.setData({ 'statusArr': updateStatusArr }); } })
说明:点击后给statusArr赋值。
如果我们是多个的话,如何去实现呢,比如上面有5条,我们可以去定义一个数组:
statusArr: [false, false, false, false, false]//假设有5个,这个可根据返回的数据个数进行赋值
wxml:
<view class="guzhi-item {{statusArr[0] ? 'vshow' : 'vhide'}}"> <view class='guzhi-tt' data-index="0" bindtap="bindViewTap"><text class='bold'>SP500</text><text class='dian'></text>标普500</view> <view class="guzhi-down m20 dn">标准普尔500指数是记录美国500家上市公司的一个股票指数,这个股票指数由标准普尔公司创建并维护</view> </view> <view class="guzhi-item m30 {{statusArr[1] ? 'vshow' : 'vhide'}}"> <view class='guzhi-tt' data-index="1" bindtap="bindViewTap"><text class='bold'>DJ30</text><text class='dian'></text>道琼斯30</view> <view class="guzhi-down m20 dn">道琼斯指数,是一种算术平均股份指数,是目前世界上历史最为悠久的股票指数。</view> </view> <view class="guzhi-item m30 {{statusArr[2] ? 'vshow' : 'vhide'}}"> <view class='guzhi-tt' data-index="2" bindtap="bindViewTap"><text class='bold'>CHINA300</text><text class='dian'></text>中华300指数</view> <view class="guzhi-down m20 dn">是由上海和深圳证券交易市场中选取300只A股作为样本,覆盖沪深市场六成左右的市值</view> </view> <view class="guzhi-item m30 {{statusArr[3] ? 'vshow' : 'vhide'}}"> <view class='guzhi-tt' data-index="3" bindtap="bindViewTap"><text class='bold'>TECH100</text><text class='dian'></text>纳斯达克100</view> <view class="guzhi-down m20 dn">全球最大的证券交易市场,反映纳斯达克证券市场行情变化的股票价格平均指数,基本指数为100</view> </view> <view class="guzhi-item m30 {{statusArr[4] ? 'vshow' : 'vhide'}}"> <view class='guzhi-tt' data-index="4" bindtap="bindViewTap"><text class='bold'>JPN225</text><text class='dian'></text>日经指数225</view> <view class="guzhi-down m20 dn">经济平均指数,简称日经平均指数NIKKEI225,是东京证券交易所交易的225品种的股份指数。</view> </view> <view class="guzhi-item m30 {{statusArr[5] ? 'vshow' : 'vhide'}}"> <view class='guzhi-tt' data-index="5" bindtap="bindViewTap"><text class='bold'>HK50</text><text class='dian'></text>港股50</view> <view class="guzhi-down m20 dn">是香港蓝筹股变化的指标,亦是亚洲区广受注目的指数</view> </view>
完整JS代码:
Page({ data: { statusArr: [false, false, false, false, false]//假设有5个,这个可根据返回的数据个数进行赋值 }, bindViewTap: function (e) { let that = this, idx = e.target.dataset.index, updateStatusArr = that.data.statusArr.slice(0); //复制新数组 updateStatusArr[idx] = !that.data.statusArr[idx]; that.setData({ 'statusArr': updateStatusArr }); } })
说明:用数组去处理,就很简单了,这个只是一个案例;如果我们去处理其他的多条数据交互,可以类似处理。
如果我们想每次只能有一个展开的效果,我们可以去做些判断即可,这里就不啰嗦了,不懂的话,加QQ群咨询。
具体的效果,大家可以去微信开发工具里弄个DEMO测试下。
三、点击实现TAB选项卡切换功能
在微信里实现TAB切换,跟上面介绍的方法类似,为了实现动画效果,我们一般都会结合官方自带的swiper去实现。比如我们要实现3个tab切换内容,一起来了解下:
wxml
<view class="swiper-tab"> <view class="swiper-tab-item {{currentTab==0?'active':''}}" data-current="0" bindtap="clickTab">Web前端之家</view> <view class="swiper-tab-item {{currentTab==1?'active':''}}" data-current="1" bindtap="clickTab">前端工具</view> <view class="swiper-tab-item {{currentTab==2?'active':''}}" data-current="2" bindtap="clickTab">小程序</view> </view> <swiper current="{{currentTab}}" duration="300" bindchange="swiperTab"> <swiper-item ><view>Web前端之家 - 内容</view></swiper-item> <swiper-item><view>前端工具 - 内容</view></swiper-item> <swiper-item><view>小程序 - 内容</view></swiper-item> </swiper>
这个框架是不是很眼熟,跟html很类似,不用多介绍吧。
关键是JS代码的写法。如下:
Page({ data: { currentTab: 0 }, //滑动切换 swiperTab: function (e) { var that = this; that.setData({ currentTab: e.detail.current }); }, //点击切换 clickTab: function (e) { var that = this; if (this.data.currentTab === e.target.dataset.current) { return false; } else { that.setData({ currentTab: e.target.dataset.current }) } } })
相对于上面介绍的二种点击方法,它多了个判断this.data.currentTab === e.target.dataset.current,当点击tab跟内容相匹配的时候,会执行相应的动作。
四、点击弹出层
点击弹出相关内容层,官方会固定一个模板,我们一般很少去用它,因为太丑了,所以我们需要自定义,如何去实现呢?
首先我们看下官方的JS模板:
wx.showModal({ title: '提示', content: '这是一个模态弹窗', success: function(res) { if (res.confirm) { console.log('用户点击确定') } else if (res.cancel) { console.log('用户点击取消') } } })
我们可以给某个按钮绑定一个事件,然后去执行这个弹出的内容。如果要自定义的话,一起学习下吧。
写段wxml
<button type="default" bindtap="toastShow">点击弹出toast</button> <toast hidden="{{status}}" duration="3000" bindchange="toastHide"> 这是toast </toast> <view class="myStyle">这是status的值:{{status}}</view>:
JS代码
Page({ data:{ status:status //data里面的属性可以传递到视图 }, //点击弹出 toastShow: function(event) { console.log("触发了点击事件,弹出toast") status = false this.setData({status:status}) //setData方法可以建立新的data属性,从而起到跟视图实时同步的效果 }, //点击关闭 toastHide:function(event){ console.log("触发bindchange,隐藏toast") status =true this.setData({status:status}) } })
说明:弹出、关闭的原理跟我们日常写的JS基本一样,通过toastShow和toastHide两个函数来实现,当给stadus复制为true的是时候关闭,false的时候弹出,是不是很简单呢。
这里我想提个问题,如果弹出层跟canvas一起用的时候,你会发现弹出层会永远都是在canvas下,无论怎么去设置zindex都无用,如何去处理呢?
.....
这个坑的确很深,为了让大家能够不踩,这里直接分享下:
我们可以用cover-view来代替view的弹出层。这样就可以了,虽然实现了“弹出层在canvas上”的效果,但是问题又来了,如果想把关闭按钮放到弹出层外面的话,又不行了,为什么会出现这样的问题?
因为cover-view自带overflow:hidden属性,并且你无法改变,这个真的要吐槽下小程序组件了,所以遇到这种问题,我们不能嵌套了,只能把关闭和层分开,并行处理。
OK,貌似点击的事件应用基本就这些了,至于其他复杂的,都是从这些衍生出去的。
总结
本次分享,也是近些日做的一些项目经验总结,其实微信小程序坑还有很多,后面会慢慢分享。对于一个小程序开发的新手,应该多去踩踩,这样你才会进步,只有踩过的,才会记忆犹新,难道不是吗?
最后希望大家能加入我们QQ群,也可以关注我们的微信公众号,可以了解最新的动态和咨询。
网友评论文明上网理性发言 已有0人参与
发表评论: