扒一扒小程式的坑
小記最近幾個月和公司的同事一直在馬不停蹄的開發小程式,經歷了幾個版本的迭代後也總算是穩定了下來。而我們的小程式也是得到了騰訊的認可,還拿了個獎
開發小程式的過程中踩的坑不可謂不多,而有些坑也實在是讓人鬱悶,不扒一扒難以平我心頭之憤吶。
這個 {{}} 裡面不能執行任何的方法,只能做簡單的四則運算和Boolen判斷,比如:
<view wx:for="{{['1.22', '2.22', '3.222']}}" wx:for-item="i">
{{parseInt(i)}}
</view>
你這麼幹是不行的,你只能在拿到資料的時候就先對資料格式化一遍。是不是很噁心~~~
但是你如果非要在渲染的時候再格式化的話也行,你就只能通過WXS來處理了,比如:
<wxs module="m1">
var parse = function(str) {
return parseInt(str);
};
module.exports.parse = parse;
</wxs>
<view wx:for="{{['1.22', '2.22', '3.222']}}" wx:for-item="i">
{{m1.parse(i)}}
</view>
小程式的幾個導航api,都可以通過 url 給對應的頁面傳參。而 w x.navigateBack({delta}), 只接受一個delta(返回的頁面數)引數。但是有時候確確實實有向回退頁面傳引數的情況,這時候就只能通過localstorage或是redux等來處理了。
小程式提供的 rpx 單位確實讓我們開發的時候在高精度還原設計稿上省了很多事情。但是小記發現當你使用1rpx在一些機型上特別容易出問題。
.border {
border: 1rpx solid #000;
}
如果你這樣設定邊框的時候,大多數情況下它都能正常顯示,但是在一些機器上尤其是 iPhone X 邊框有時候根本不顯示。所以我現在都改成 2rpx
繫結事件獲取的target與currentTarget是有區別的
在繫結事件獲取當前元件資料的時候,拿到的envt裡面有target和currentTarget 這兩個玩意兒裡面都有一個dataset,而我們需要獲取的資料就在dataset物件裡面。正確的我們應該取 currentTarget 裡面的就行,但是有時候這兩個的資料是完全一樣的,一不小心你就取錯了。
那這個 target 和 currentTarget 有什麼區別呢,官方的解釋:
target:觸發事件的源元件;
currentTarget: 事件繫結的當前元件;
看個例子:
<view id="outer" bindtap="handleTap1">
outer view
<view id="middle" catchtap="handleTap2">
middle view
<view id="inner" bindtap="handleTap3">
inner view
</view>
</view>
</view>
點選 inner view 時,handleTap3 收到的事件物件 target 和 currentTarget 都是 inner,而 handleTap2 收到的事件物件 target 就是 inner,currentTarget 就是 middle。
其實很容易區分,target就是事件開始的地方,currentTarget就是你繫結事件的地方。可以去看看小程式事件
iconfont, 圖片不能通過css,哦~應該該叫 wxss 本地引入。
1、iconfont @font-face 引用的ttf等檔案在小程式中不支援,可以使用線上或轉base64 參考 微信小程式wxss樣式檔案中引用iconfont素材。
2、圖片可以使用base64或者線上連結。或者<image>哦,對了圖片連結一定要帶 https 協議頭,形如://cdn.xxx.com/jflkadsjf.png 是不行的
需要主動開啟
<view hover hover-class="view-hover">
下面是一個page 示例:
<!-- wxml -->
<view class="page-layout">
<view class="page__title">flex-direction: row</view>
<view class="flex-wrp" style="flex-direction:row;">
<view class="flex-item green">1</view>
<view class="flex-item red">2</view>
<view class="flex-item blue">3</view>
</view>
</view>
/* wxss */
.page-layout {
color: #000;
}
/* 下面這種寫法 .red 是不生效的 */
.red {
color: #f00;
}
/* 必須這麼寫 */
.page-layout .red {
color: #f00;
}
wxs 中如果使用了較新的 ES6 語法會導致小程式在iOS8機器上無法執行。小程式開發工具估計是沒對wxs裡面的ES6進行編譯
// wxs
var getDesc = function(str) {
var strAry = str.split('·');
var desc1 = strAry[1] ? strAry[1] : '';
var desc2 = strAry[0];
//return {desc1, desc2} // 這裡這種寫法在iOS8上是沒法正常執行的
return { // 必需採用ES5 的寫法
desc1: desc1,
desc2: desc2
}
}
module.exports.getDesc = getDesc;
image 使用延遲載入問題
筆者之前在使用 <image/>的時候啟用了延遲載入,也就是
<image mode="widthFix" src="{{imgurl}}" lazy-load></image>
這個絕大部分情況下是沒問題的,但是有一天運營突然來找我說,他們配的活動頁面上的部分圖片在部分機型(比如:筆者的Iphone 7)上載入不出來。直覺告訴我估計是 “lazy-load” 問題,幹掉後固然都正常了。後面特意對比了一下,發現無法load出來的圖片都比較大,基本上是1500的寬度。
不知道是不是個例,丟擲來給大家看看。
獲取使用者資訊介面如果之前使用者未授權過,呼叫該介面將直接報錯,不再出現授權彈窗。只能通過button元件拉起授權。具體看文件
<button open-type="getUserInfo"></button>
微信小程式自 基礎庫 1.6.4開始支援了web-view元件,也就是可以在小程式裡面內嵌網頁,但是個人型別與海外型別的小程式暫不支援使用。
小程式無法和網頁通訊,如果需要攜帶引數,只能通過web-view url 中攜帶引數,網頁可以通過 wx.miniProgram.postMessage
向小程式傳資料但是基礎庫版本要在1.7.1以上且小程式只能在特定時機(小程式後退、元件銷燬、分享)接收到資訊。
小程式內建網頁可通過 window.__wxjs_environment
變數判斷是否在小程式環境。一般情況下web需要適配在判斷是否在微信瀏覽器中開啟,普通瀏覽器中開啟,小程式中開啟,然後會有以下程式碼:
// 判斷是否在微信瀏覽器中
function isWeixinBrowser() {
return /micromessenger/i.test(navigator.userAgent.toLowerCase());
}
if ( isWeixinBrowser() ) {
// to do something
} else if ( window.__wxjs_environment ) {
// to do something
} else {
// to do something
}
如果這麼寫那麼小程式的那個分支永遠也進不去,為什麼?自己想
// 判斷是否在微信瀏覽器中
function isWeixinBrowser() {
return /micromessenger/i.test(navigator.userAgent.toLowerCase());
}
if ( window.__wxjs_environment ) {
// to do something
} else if ( isWeixinBrowser() ) {
// to do something
} else {
// to do something
}
這麼寫就好了
- 任何情況下的檢視更新只能通過setData()
- 路徑只能是十層。
- 不要直接對 Page.data 進行修改,請使用 Page.setData
- 跳轉到tabbar頁面一定要用 wx.switchTab()
- 使用wx:for遍歷的時候最好加上wx:key=”{{index}}”
- 小程式目前還沒有IphoneX 的適配方案,只能通過自己判斷系統新增相應適配
寫於 2018年1月26日 Web 4609
如非特別註明,文章皆為原創。
轉載請註明出處: https://www.liayal.com/article/5a6b07137de5e93eee4137ca