最近接觸百度小程序挺多,開發了幾個產品,都快被百度的小程序折磨死。真的是不想吐槽了,接下來我就講講我遇到的坑與一些經驗。
1. s-for
這個for循環的寫法為 s-for='arr' 或者 s-for = 'item,index in arr' 。這些到沒什么,主要是s-for不能循環常數。。。這讓我從微信小程序轉到百度小程序不太習慣。。。官方回應說什么底層diff差異哦,后面會修復。不知道現在修復好沒。
2. 自定義組件之命名與路徑
引用組件的時候,在json文件中,usingComponents 選項里填入要引入的組件並自定義名稱:"my-radio":"/components/bd-radio/bd-radio"。需要注意的是:這個組件的名稱不支持駝峰和大寫寫法。路徑支持絕對路徑和相對路徑。
3. 自定義組件之組件通訊
子組件 this.triggerEvent('getchange', idx); 觸發事件,getchange是父組件需要接收的事件名,第二個參數是需要傳回去的數據,最好是object,其它的參數,在2.0.3之前不支持。
父組件 <my-radio bindgetchange='getSex'></my-radio> bindgetchange bind后面的就是子組件傳過來的事件名,再后面一個(getSex)就是父組件中定義的函數,接收的時候e.detail,就是自組件傳過來的數據
4. 獲取索引值
如果要獲取s-for中當前點擊元素的索引值,只有在元素上添加 data-idx='{{index}}' 自定義屬性,然后點擊事件里面,通過:e.currentTarget.dataset.idx 獲取。
5. swan.request
百度小程序的 swan.request 只支持 https協議。如果你不小心接口弄成了HTTP協議的url,在開發者工具上完全沒問題,但是真機調試的話,如果你運氣好,就沒問題,運氣不好在某些手機上就會出現接口無反應的情況,並且swan.request 的fail打印出: illegal request 非法請求。但是又沒報錯。所以,這個情況的提示也是不明顯的,誰知道那個非法請求是接口還是url地址的錯啊。
還有就是百度好像並沒有對這個接口中的url進行encodeURIComponent,所以如果有中文,那自己需要進行編碼一次。
6. swan.setStorageSync
swan.setStorageSync 這個同步的存儲數據接口,官方文檔說:參數支持String key, Object/String data。我第一次使用這個接口的時候,沒注意看參數,結果傳了一個布爾值進去,但是使用swan.getStorageSync獲取的時候,始終獲取不了,結果發現數據最外層包了一個data屬性。即正常是xxx:true,實際上取出來是 data:{xxx:true} 也是醉了。。。不支持的至少給個錯誤提示啊。。。
7. rich-text
使用rich-text富文本組件的時候
<rich-text node="{{a.b}}"></rich-text> //如果a是后台取的,在js的data中初始化的時候,如果a設置為null,有可能會報錯,導致頁面復制相同的內容,即出現兩個相同的內容連在一起。所以最好設置為 {} 空對象。
而且如果遇到識別不了的標簽會停止渲染,並且不會有錯誤提示。。。
我遇到過幾次出現兩個相同的內容連在一起的情況,忘了截圖的,具體怎樣出現的也忘了。。。
8. image 組件出現 image load faild
如果遇到某些時候圖片路徑是正確的,但是出現 image load faild 這個錯誤,我也不知道怎么解決。官方回答說不影響開發就行。。。特別是從一個頁面navgitor或者其它的跳轉方式跳轉到另外的頁面,就有可能會出現這種情況。而且圖片還是本地的。。。
官方回復說:image圖片地址只支持https協議,並且在小程序后台進行域名配置,或者百度域名的圖片,不滿足條件的話,圖片將無法正常顯示。不過有時候還是會出現上面的問題。
9. H5支付 轉到 百度支付 swan.requestPolymerPayment
關於百度小程序支付:最開始我天真的以為,web-view嵌套一個已經完善的H5商城,支付的時候也可以直接使用自己對接的H5的支付。因為在本地預覽時,不管安卓還是IOS,都可以支付成功,沒問題。但是只要一發布上線,支付的時候就調不起微信或者支付寶的支付彈窗了。都不能跳轉到支付彈窗的頁面。安卓機全部不得行,IOS沒問題。抓包發現結果返回正常,沒有錯誤。我估計是百度官方屏蔽了。官方給出的回答是:為保護用戶的資金安全,小程序的web-view不支持自行調用第三方支付服務。如有支付需求,建議接入百度收銀台。。。但是,但是,但是。。。我看到蘇寧易購的百度小程序就是使用的自己對接的第三方支付,並沒有使用百度的支付接口。。。我就很奇怪了,為撒子蘇寧易購就可以???
10. web-view的src也可以使用localhost
web-view的src也可以弄成IP地址的情況。比如我本地使用vue-cli運行了一個項目,假設為http://localhost:8087/szxgcs/detail.html。這時我把localhost改成自己的IP地址,然后在web-view的src中:
<web-view src='http://192.168.xxx.xxx:8087/szxgcs/detail.html'></web-view> //這樣就能運行在本地的代碼了
11. 使用未申明的變量,有可能會沒錯誤提示
有時候在某些接口中,或者request的data中,使用that.data.xxx的時候,由於我粗心,that沒有聲明。所以在運行的時候,發現調接口沒反應。但是又沒有提示哪里有錯,就很懵逼。所以一定要檢查某些變量是否聲明的。不過現在好像改好了,不聲明會報錯了。
12. swan.setPageInfo,小程序開啟web化功能
現在落地頁(即打開小程序第一眼看到的頁面)如果是web-view嵌套的頁面,也能配置swan.setPageInfo。而且能通過審核。不清楚是不是改了審核的條件,反正以前是不能審核通過的。swan.setPageInfo只能用於開啟web化功能。為什么要配置這個?因為在百度app中,小程序無法被爬蟲感知。所以需要配置,這樣才能被搜索引擎抓取收錄。
13. 發布審核時設置基礎庫版本高一點。
建議發布審核的時候,把開發者平台 --- 設置 --- 基本設置 --- 基礎庫最低版本設置 設置高一點。低版本出現了問題,如果是百度的問題,官方是不會給你修復的,這是官方技術人員回復我的原話。一般設置3.xxx以上就可以了,3.xxx以前的沒多少用戶了。這樣也可以避免審核的時候測試人員在低版本測試,出現不清楚原因的bug。
14. s-if不能和s-for一起用。有可能出現不可預知的錯誤。還有就是 s-if 一定要寫在最前面,不然有可能也會出現一些小問題。。。
.假如需要給組件傳遞內容,這個內容是異步獲取的,那么在組件里,獲取的時候,有可能會遇到獲取不到傳過來的內容,這個很正常。在H5的vue中,我使用v-if來避免獲取不了的情況。類似:
</ child :sendval='data' v-if='data' > //data初始化為false,這樣,只有在data真實獲取到內容的時候,才渲染組件。 //但是,在百度小程序中,判斷條件必須寫在前面即: <child s-if='data' :sendval='data' ></child> //不然,還是會出現獲取不了內容的情況
15. swan.createSelectorQuery() 有時需要延時獲取寬高等信息。
swan.createSelectorQuery()這個獲取dom元素的接口,如果獲取的dom元素是動態添加的,那么,在調用boundingClientRect獲取寬高等信息的時候,是需要延時獲取的。這個在組件中更明顯,就算組件加了s-if,在數據成功返回之后再渲染組件,但是渲染的過程也需要耗時,所以,不能及時地獲取到元素的信息。就算使用swan.nextTick()也沒作用,有時候也會獲取不到。我設置setTimeout延時一般是150ms
16. swan.nextTick()
swan.nextTick()就是提供一個異步操作。從來就沒用過,官方的描述也是雲里霧里的。感覺和vue的nextTick不太一樣。因為我試過相同情況下相同的代碼,兩個的表現不一樣。
17. 慎用sConsole
web-view中的h5頁面跳轉到小程序有可能會打開兩次。這個情況是打開了SConsole調試面板的,關閉之后就不會出現這個情況。
其它情況使用sConsole也有可能會出現某些小問題。。。也有可能會導致出現一個頁面,出現兩個相同body內容的情況
18. getSwanId
getSwanId在開發者工具上,返回的是SWAN-DEVELOP,而真機上是一段長度為幾十個的字母和數字組成的字符串。
19. css單位
css單位基本都支持,不過如果是rpx這種,小程序會自動轉換成vw或者vh,所以你會看到控制台里的單位都是vw或者vh
20. getStorage
getStorage獲取本地不存在的數據,默認進入success,不會進入fail回調
21. 分享到貼吧
在代碼中配置好,並且上線小程序后,我以為這樣就能申請分享白名單了。。。然而,按鈕竟然沒給我激活,點不動。。。搞不清楚原因。。。然后就放棄了
上面這些是真實遇到的情況,真的累,本來只花一天的時間搞得定的內容,一路踩坑結果多花了兩三倍的時間。。。逐漸懷疑我是不是做程序員的料。。。
后面還會繼續開發百度小程序,估計又會折壽了。。。
新增:
22. swan.getSystemInfoSync().host 一直顯示為undefined,不管是真機還是開發者工具都不行
官方已經回復這個問題,說是:安卓最新版11.10可以獲取到的,但是11.10以下的就不行,應該是雙端diff。后面會修復
23. 部分iOS客戶端可能出現,setInterval 只執行一次的bug
問題的源頭:點這里
24. 控制台答應出來的內容顯示的行號和正常console.log打印的行號位置對不上
官方回復:生成的sourceMap指向的源文件是經過babel轉換后的資源,所以會存在行號對不上的情況,我們會后續修復,感謝反饋
25. 頁面用es5開發,項目信息里勾選掉 ES6 轉 ES5會報錯
原因不清楚,解決辦法就是不要管它,讓它一直勾選就行了。。。。。。
26. 使用2.4.1發布小程序之后,在開發者后台的體驗二維碼顯示的內容和發布的內容不一致。
這個bug真的是害人,浪費了很多時間。具體是怎么產生的不太清楚,我各種清除緩存,各種刪除再預覽還是這樣,掃描本地的就是正常的,就是剛發布上線的體驗版就不一樣。。。。。。官方讓我刷新頁面再看二維碼??????你在逗我??????
最后把開發者工具換成2.4.0 再發布就沒問題。。。。。。所以到現在開發者工具都已經2.4.3了,我都還不敢更新。。。。。。
27. 遠程調試打開之后顯示404
解決辦法: 首先,百度App 客戶端的登錄用戶和開發者工具的登錄用戶是當前 appid(智能小程序ID)的開發者。然后,保證在同一網段即處在同一局域網中。如果滿足這兩個條件,還是404頁面,那么就關閉控制面板中的防火牆。一般這個時候就沒問題,能自動顯示遠程調試的控制台了。