細數百度小程式踩的坑

站住,別跑發表於2019-06-06

最近接觸百度小程式挺多,開發了幾個產品,都快被百度的小程式折磨死。真的是不想吐槽了,接下來我就講講我遇到的坑與一些經驗。

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接入百度資訊流

接入百度資訊流的申請,就是在頁面配置swan.setPageInfo,如果小程式首頁是web-view巢狀的頁面不是百度小程式原生開發的頁面。那麼就會申請不了。現在預設都是接入了百度資訊流的,所以如果沒配置,會出現讓你配置的警告資訊。建議程式碼寫成swan.setPageInfo && swan.setPageInfo({配置內容}) ,如果不這樣寫,按照官方的寫法,在真機除錯中,會報錯。

13. 釋出稽核時設定基礎庫版本高一點。

建議釋出稽核的時候,把開發者平臺 --- 設定 --- 基本設定 --- 基礎庫最低版本設定 設定高一點。低版本出現了問題,如果是百度的問題,官方是不會給你修復的,這是官方技術人員回覆我的原話。一般設定3.xxx以上就可以了,3.xxx以前的沒多少使用者了。這樣也可以避免稽核的時候測試人員在低版本測試,出現不清楚原因的bug。

14. s-if不能和s-for一起用。有可能出現不可預知的錯誤。還有就是 s-if 一定要寫在最前面,不然有可能也會出現一些小問題。。。

.假如需要給元件傳遞內容,這個內容是非同步獲取的,那麼在元件裡,獲取的時候,有可能會遇到獲取不到傳過來的內容,這個很正常。在H5的vue中,我使用v-if來避免獲取不了的情況。類似:

</ child :sendval='data' v-if='data' >
//這樣,只有在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也有可能會出現某些小問題。。。

18. getSwanId

getSwanId在開發者工具上,返回的是SWAN-DEVELOP,而真機上是一段長度為幾十個的字母和數字組成的字串。

19. css單位

css單位基本都支援,不過如果是rpx這種,小程式會自動轉換成vw或者vh,所以你會看到控制檯裡的單位都是vw或者vh

20. getStorage

getStorage獲取本地不存在的資料,預設進入success,不會進入fail回撥

21. 分享到貼吧

這個功能,官方有說明: 這裡是接入文件       這裡是簡單說明

在程式碼中配置好,並且上線小程式後,我以為這樣就能申請分享白名單了。。。然而,按鈕竟然沒給我啟用,點不動。。。搞不清楚原因。。。然後就放棄了

 

上面這些是真實遇到的情況,真的累,本來只花一天的時間搞得定的內容,一路踩坑結果多花了兩三倍的時間。。。逐漸懷疑我是不是做程式設計師的料。。。

後面還會繼續開發百度小程式,估計又會折壽了。。。

 

相關文章