開發(Tips)
避開頻繁setData *
小程序端對於頻繁的邏輯層和顯示層的交互很不友好,特別是安卓機,與瀏覽器上js直接操作DOM不同,小程序通過邏輯更新顯示層並不完全實時,開發者應避免出現頻繁setData以達到某種視覺效果的操作,如有需要,直接使用框架或頁面自帶的組件。
組件化開發和分包加載
官方對小程序本身大小的限制為:
▪ 整個小程序所有分包大小不超過 8M
▪ 單個分包/主包大小不能超過 2M
為節省代碼和方便團隊協作開發,應盡量采用組件化開發方式,業務上更好地解耦協作,考慮控制主包不超過2M大小和優化首頁加載速度,應優先使用分包加載。
調試(Tips)
避開請求域名以及 TLS 版本校驗
▪ 開發者工具右上角“詳情”
▪ 手機端右上角 ··· -> 打開調試
框架(坑)
enablePullDownRefresh
Q: 頁面開啟下拉刷新,下拉刷新時ios會出現頁面向上彈一下再回彈的情況。
S: 下拉刷新的時候不要同時調用wx.showLoading。
組件(坑)
web-view
Q: web-view組件沒有完全覆蓋頁面,底部留有空隙。
C: 造成上面情況的前提是小程序配置有tabBar且小程序的初始頁面為tabBar的其中一個tab,后面打開web-view頁面時,web-view高度計算為當前頁面減去底部tabBar的高度,所以底部留出了tabBar高度的空隙。
S: 初始頁面為非tab頁面再進行跳轉到tab頁面。
Q: 小程序端首次授權拿不到faiOpenid導致卡包中心列表中沒有獎品記錄。
S : 在小程序里拿到unionid通過參數帶到web-view中,再在游戲端做關聯邏輯處理。
input
Q: 當刪除文字時,部分安卓機會監聽兩次,第一次是空字符串,第二次才是當前文本。
S: 對input的監聽進行函數防抖操作,如設置300ms的防抖時差,即bindinput獲取到input的內容值后300ms內如果沒有再觸發一次input事件,那么就對當前的值進行下一步操作,從而避開上述的空字符場景。
Q: 在小米8上,input組件無法被彈起,特別是fixed懸浮在底部時。
button
Q: 無法去除邊框
S: 添加偽元素樣式,代碼如下:
button::after{ border: none; }
textarea
A : textarea組件是使用元素組件層級最高,導致在使用是出現各種問題
swiper
A : 將swiper組件當tab導航使用時,在它的內容層級使用swiper-view組件, 當點擊tab導航時,改 current,觸發swiper的 bindchange時,使用setData改變current會導致鬼畜。更改swiper-view為view,判斷sourc操作來源,可以在一定程度上解決問題。
接口(坑)
wx.navigateBack
Q: 在安卓機下,從頁面pageA中navigateTo進入到pageB,在pageB的生命周期函數onLoad或onShow中調用wx.navigateBack會出現小程序直接退出的情況。
S: wx.navigateBack的使用改為在onReady中可一定頻率上避免,但不能100%避免,如果真有必要進行以上邏輯,可多做一步setTimeout延時操作。
wx.getUserInfo
A: 官方對此接口做了調整: 當用戶未授權過,調用該接口將直接進入fail回調,而不會再出現授權彈窗,目前體驗版和開發版已做此調整,線上暫時沒做調整,預計后面會進行過渡調整,后面開發應以新的接口方案做流程,改用 <button open-type="getUserInfo"></button> 引導用戶主動進行授權操作。
selectorQuery.select
A: 通過selectorQuery拿到元素的信息時應注意,對於被撐開的容器,當該容器內部存在獨立組件時,所拿到的容器高度不一定准確,推測計算原理是遍歷容器內元素,但組件內信息無法直接獲取。
wx.setBackgroundColor
Q: 在IOS端設置backgroundColor參數有時會失效。
S: 在onload生命周期函數中設置可一定程度避免失效,最好是同時設置backgroundColor,backgroundColorTop,backgroundColorBottom。
樣式(坑)
transform
A: 一些版本的小程序只支持translate和translate3D,對於translateX/Y/Z不支持。
image
Q: 設置image為圓角時,加載圖片后會先刪一下再變成圓角。
C: 圖片加載后觸發頁面大面積繪制,頁面來不及反應造成渲染掉幀/卡幀。
S: 使用GPU加速,代碼如下:
image{ will-change: transform; }
inline-block
Q:ios下,相鄰的兩個塊用了inline-block,第二個元素位置會比預期的位置要低很多。
S:使用float或者flex或者absolute布局,讓此元素變成塊。
position : fixed
Q:開啟下拉刷新后,ios端fixed元素不會隨頁面下拉刷新而向下移動,從而擋住了加載樣式。
S:在ios端動態設置fixed元素的position,當頁面滾動 scrollTop < 0 時,將元素position設為absolute。(已棄用)
S:使用 position : sticky ,該布局相當於 fixed 和 absolute 的結合版,詳情見 http://www.css88.com/book/css/properties/positioning/position.htm。(低版本安卓可能不支持該屬性值,部分版本因為內核的變換也可能不支持,故要做好兼容處理,可用fixed做兼容)