最近10幾天都在學(xué)習(xí)小程序的開發(fā),遇到了一些問題和筆記有趣的東西,今天總結(jié)了一下,和大家分享
1.小程序中的template模塊使用
在一個月黑風(fēng)高的夜晚,我突然發(fā)現(xiàn)一個很有意思的東西,那就是template模塊,它可以將你定義的一個HTML5模塊包住,然后利用template,在你的小程序任意一個頁面使用,這樣極大的減少了程序中的復(fù)制-粘貼,復(fù)制-粘貼(一般用于需要循環(huán)使用的界面)。下面就用我自己的一個template模塊來講解下。
先進(jìn)步:創(chuàng)建頁面
在pages里面創(chuàng)建存儲你template模塊的頁面,便于其他頁面對其的引用
"pages/index/index", "pages/find/find", "pages/gift/gift", "pages/activity/activity", "pages/common/list",//存儲template模塊的頁面 "pages/white/white"
第二步:創(chuàng)建template模塊
template模塊實(shí)例
<template name="job_list"> <view class="br"></view> <navigator url="../white/white" class="page_appmsg"> <view class="page"> <view class="page__hd "> <image class="page__thumb" src="{{image}}" mode="aspectFill"/> <view class="page__hd_title"> <view class="page__hd_title title">{{title}}</view> <view class="page__hd_title school">{{school}}</view> <view class="page__hd_title request"> <text class="page__hd_title pink">{{pink}}</text> <text class="page__hd_title time">{{time}}</text> <view class="page__hd_title cool"><i class="iconfont icon-zan1 active"></i>{{cool}}</view> </view> </view> </view> <view class='page__ft'> <i class="iconfont icon-jian-copy active"></i>{{page__ft}}} </view> </view> </navigator>
在你需要重復(fù)使用的html用一個template標(biāo)簽包起來,并給它取個名字 。 (當(dāng)然了,還有WXSS的編寫,這里因?yàn)椴皇呛苤匾揖筒环懦鰜砹耍?完成了這步,你就可以盡情的在你需要這個模板的頁面引用這個模塊了。
第三步:在各個頁面引用template模塊
①在你想要引用的界面的WXSS和WXML上引用template的wxml和wxss,
@import '../common/list.wxss'; <import src="../common/list.wxml" />
②在你需要的盒子里面添加template標(biāo)簽,你想要引用那個template模塊,就在is里面填哪個模塊的名字
<template is="job_list" data="{{jobs}}"/>
如果你是在一個循環(huán)里面引用的template就需要改為data="{{...item}}"如:
<block wx:for="{{jobs}}" wx:key="{{index}}"> <template is="job_list" data="{{...item}}"/> </block>
代碼:
<import src="../common/list.wxml" /> <view class="swiper-tab"> <view class="swiper-tab-item {{activeIndex==0?'active':''}}" data-current="0" bindtap="clickTab">活動</view> <view class="swiper-tab-item {{activeIndex==1?'active':''}}" data-current="1" bindtap="clickTab">視頻</view> <view class="swiper-tab-item {{activeIndex==2?'active':''}}" data-current="2" bindtap="clickTab">直播</view> </view> <swiper current='{{activeIndex}}' bindchange="swiperTab"> <swiper-item> <view class="swiper-item__content"> <block wx:for="{{jobs}}" wx:key="{{index}}"> <template is="job_list" data="{{...item}}"/> </block> </view> </swiper-item> <swiper-item> <view class="swiper-item__content"> <block wx:for="{{jobs}}" wx:key="{{index}}"> <template is="job_list" data="{{...item}}"/> </block> </view> </swiper-item> <swiper-item> <view class="swiper-item__content"> <block wx:for="{{jobs}}" wx:key="{{index}}"> <template is="job_list" data="{{...item}}"/> </block> </view> </swiper-item> </swiper>
效果圖:

2.數(shù)據(jù)綁定
又是一個月黑風(fēng)高的夜晚,我在實(shí)現(xiàn)點(diǎn)亮的功能的時候,發(fā)現(xiàn)我只點(diǎn)了一個地方的點(diǎn)贊,整個頁面的點(diǎn)贊都亮了起來,這肯定是不行的,用戶明明只對這一個感興趣,你怎么能全部點(diǎn)亮呢?于是我開始了思考,發(fā)現(xiàn)我犯了一個十分愚蠢的問題,那就是沒有給我的數(shù)據(jù)綁定一個值,這就好像沒有給喊名字一樣:到了飯點(diǎn)你出去大喊一聲:兒子,回家吃飯了!結(jié)果肯定是家家的兒子都回去吃飯了,然而別人家的飯都還沒開始煮呢,你怎么就喊人家回去了呢,你肯定得喊:二狗子,回家吃飯了!別人家的娃才不會也跟著回家。這和點(diǎn)擊事件是一個道理的,你必須給你的每項(xiàng)數(shù)據(jù)綁定一個id,用if語句,將數(shù)組遍歷一遍,將每個數(shù)據(jù)的ID拿出來看看,看下你點(diǎn)的這個數(shù)據(jù)的ID,與數(shù)組中哪個相符合。如何成功配對了 ,恭喜,你可以執(zhí)行點(diǎn)亮操作了! 功能實(shí)現(xiàn)如下:
-
wxml
<a wx:if="{{!item.isSelected}}" id="dianzan1" data-id = "{{item.id}}" bindtap="cool"> <i class="iconfont icon-dianzan1 active"></i> </a> <a wx:if="{{item.isSelected}}" id="dianzan1" data-id = "{{item.id}}" bindtap="cool"> <i class="iconfont icon-dianzan1-copy active"></i> </a>
在數(shù)據(jù)中,我不僅給了它一個ID,還給了它一個布爾值,并且全部定為false,這樣便可以通過 wx:if="{{!item.isSelected}}" wx:if="{{item.isSelected}}" 來判斷展示的是點(diǎn)亮與否。
-
js
cool:function(e) { let jobs = this.data.jobs for(let key in jobs){ // 遍歷一遍數(shù)據(jù) // console.log(jobs[key].id); //將界面的數(shù)據(jù)與jobs的數(shù)據(jù)進(jìn)行匹配 if (jobs[key].id === e.currentTarget.dataset.id){ if (!jobs[key].isSelected){ //處于未點(diǎn)亮狀態(tài)時的操作 jobs[key].isSelected = true; wx.showToast({ title: '點(diǎn)贊成功', icon: 'success', duration: 1500, }) }else{ //處于點(diǎn)亮?xí)r的操作 jobs[key].isSelected = false; wx.showToast({ title: '取消點(diǎn)贊', icon: 'success', duration: 1500, }) } } } this.setData({ // 將界面更新 jobs : jobs, }); },
-
效果圖

3.下拉刷新觸發(fā)過多問題
又是一個月黑風(fēng)高的夜晚,我突然發(fā)現(xiàn)了一個bug!在小程序下拉刷新時,我明明只加了一組數(shù)據(jù),然而卻刷出來了2到3組數(shù)據(jù),(這里我使用的是scroll-view組件的bindscrolltolower屬性)

嚇得我趕緊回去看了一波代碼,如下:
lower:function(){ // if(i!=1){ // return // }i++; var that = this; // console.log('下拉加載'); wx.showToast({ title:'加載中', icon:'loading', duration: 1000, }); setTimeout(function(){ wx.showToast({ title:'加載成功', icon:'success', duration:1000, }); wx.request({ url:'http://www.easy-mock.com/mock/5a24075682614c0dc1bf0997/abc/abc', complete:(res)=>{ console.log(that.data.jobs); var jobs = that.data.jobs.concat(res.data.data.jobs) that.setData({ jobs:jobs, }) }, }) },1000);
}, 仔細(xì)看看,發(fā)現(xiàn)并沒有邏輯錯誤,我思前想后,覺得有可能是函數(shù)多次觸發(fā)導(dǎo)致的,于是我在函數(shù)的開始加入 console.log('下拉加載');在調(diào)試器中,我發(fā)現(xiàn)下拉刷新也是跟著出現(xiàn)了2次,為了更加保險(xiǎn),我在page外定義了一個var i = 1;并在函數(shù)外面加上了
if(i!=1){ return }i++;
再次測試,發(fā)現(xiàn)只出現(xiàn)了一組數(shù)據(jù),由此我確定了這個bug是由于下拉刷新觸發(fā)過多的原因。但是怎么解決呢,我想了想,覺得可以用一個鎖,把這個函數(shù)鎖起來,等函數(shù)執(zhí)行完畢,在把函數(shù)打開。 修改后的函數(shù)如下:
data: { jobs:[], windowHeigt:0, pullUpAllow:true, pullLowAllow:true
},
lower:function(){ var that = this; if(that.data.pullLowAllow) { //確定開關(guān)的開啟與否 that.setData({ pullLowAllow:false //關(guān)閉開關(guān) }) console.log('下拉加載'); wx.showToast({ title:'加載中', icon:'loading', duration: 1000, }); setTimeout(function(){ wx.showToast({ title:'加載成功', icon:'success', duration:1000, }); wx.request({ url:'http://www.easy-mock.com/mock/5a24075682614c0dc1bf0997/abc/abc', complete:(res)=>{ console.log(that.data.jobs); var jobs = that.data.jobs.concat(res.data.data.jobs) that.setData({ jobs:jobs, pullLowAllow:true //加載完畢,開啟開關(guān) }) }, }) },1000); }
},
結(jié)果:

項(xiàng)目展示
在最后,也把我辛苦Coding了N天的項(xiàng)目展示一下給大家吧 (由于一開始選題的失敗,并沒有完成什么重要的功能,大家就別說出來了T-T)
- 底部tabBar切換

- 圖片輪播與界面切換

- 點(diǎn)擊事件

- 下拉刷新與上拉刷新
