微信小程序的坑(持續更新中)


參與微信小程序開發有一段時間了,先后完成信息查詢類和交易類的兩個不同性質的小程序產品的開發;期間遇到各種各樣的小程序開發的坑,有的是小程序基礎功能不斷改進完善而需要業務持續的適配,有的是小程序使用上的一些坑;下面針對小程序開發過程中遇到的一些坑跟大家分享,有些沒有深究具體原因;

1、原生組件遮蓋的問題

由於原生組件層級最高,即使設置了其z-index也於事無補;不能隨意在其層級上展示信息,只能通過cover-viewcover-image組件(其實這兩個組件也是原生組件)來進行遮蓋;

例如,下圖在map原生組件上遮蓋層:上方banner、地圖上的氣泡指針以及右下角的歸位。

另外需要注意一點,若要在覆蓋原生組件上,還需要保證一點:

由於`cover-view`和`cover-image`也是原生組件,需要保證他們插入頁面的時機晚於要覆蓋的原生組件,即先要插入原生組件。

例如上圖中,地圖上的banner遮蓋層若不是包含在map原生組件內,那么就需要在map出現后插入,否則map組件也會覆蓋cover-veiw

2、不支持base64格式的圖片問題

小程序有些圖片是不支持base64格式的,例如cover-image,地圖marker的iconPath等。在配合webpack構建小程序代碼時需要注意不要對這些圖片進行base64轉換。

3、地圖mapContext的問題

小程序打開AB兩個頁面,B頁面由A頁面navigateTo而來,A、B兩個頁面都有地圖組件,並且兩個頁面都通過wx.createMapContext創建了地圖的mapContext。

在小程序基礎庫2.3.0~2.6.2版本下產生一個問題:

B頁面返回A頁面,A頁面地圖的mapContext提供方法的回調都不會執行,在2.6.0版本下會每次調用mapContext的方法,都會在mapContext上生成一堆callback。

例如由B頁面返回的A頁面多次調用mapContext提供的方法,會在其上掛載callback,因為回調方法得不到執行,所以掛載其上的callback函數沒法刪除

4、onError捕獲錯誤的問題

小程序通過App實例的onError方法來捕獲小程序的異常信息,通過該方法能收集異常從而實現小程序的異常監控;

小程序的錯誤收集內部具體的實現:

  • 視圖渲染層是通過window.onerror來捕獲前端錯誤
  • 服務層是通過try-catch來捕獲錯誤的

那么可以知道:

小程序對promise的unhandledrejection異常是無法捕獲的,需要開發者自己catch promise拋出的異常;

5、ios10系統下flex:1的父元素,其子元素height:100%未充滿父元素

小程序在ios10系統下,對於如下結構的模板:

<!-- 頁面內容 -->
<template>
  <view class="test">
    <view class="test1">
      <view class="child">haha</view>
    </view>
    <view class="test2"></view>
  </view>
</template>
 .test
    width: 100%
    height: 100%
    flex-direction: column
    display: flex

    .test1
      flex 1
      width 100%
       border 1px solid #000
      .child
        height 100%
        background #fc9153
    .test2
      width 100%
      height 226px
      border 1px solid #eee

在ios10的設備下,其展示效果結果如下圖所示:

可以看見,在ios10系統下,父元素view.test1的子元素view.child並未充滿整個父元素,其實這個問題在web也出現過類似問題,如:

解決辦法是父類容器設置position:relative; 子元素設置:position:absolute;width:100%,height:100%;

6、自定義組件用slot插入cover-view的問題

自定義組件使用slot嵌套cover-view 時,自定義組件的 slot 及其父節點暫不支持通過 wx:if 控制顯隱,否則會導致 cover-view 不顯示。例如:

<!-- ComponentA -->
<cover-view wx:if="{{ status === 'fail' }}">
      <slot name="before"></slot>
      <cover-view>{{ failDesc }}</cover-view>
      <slot name="after"></slot>
</cover-view>
 <!-- PageA -->
 <ComponentA>
     <cover-image src="xxx.png" slot="before"/>
    <cover-view slot="after">hellow word</cover-view>
 </ComponentA>

上面自定義組件ComponentA因為使用了slot來嵌套cover-view,而其父節點使用了wx:if控制顯隱,導致在真機環境slot的cover-image和cover-view內容不顯示。

7、mapCtx.includePoints方法配置回調函數在2.6.4版本下不執行

小程序地圖上下文方法MapContext.includePoints(Object object)配置的任何回調函數success、fail和complete均不執行,有人為此提出過類似問題this.mapCtx.includePoints回調無效
目前官方已經在>= 2.6.4版本修復了該問題,低於該版本仍然存在這個問題。

8、小程序訂閱消息方法wx.requestSubscribeMessage

微信小程序消息推送模板改為訂閱消息后,需要事先讓用戶進行消息訂閱,代碼層面是調用wx.requestSubscribeMessage方法,需要注意以下兩點:

  • wx.requestSubscribeMessage方法只能在tap事件中觸發
  • wx.requestSubscribeMessage方法只能在事件中同步調用
    否則會報requestSubscribeMessage:fail can only be invoked by user TAP gesture錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM