微信小程序開發小結

  一、點擊按鈕分享功能:javascript

  使用Button組件,設置open-type="share",而後在js文件的onShareAppMessage方法中設置以下:java

onShareAppMessage: function (options) {
let shareObj = {}
if (options.from == "button") {
    //設置title、path、imageUrl
   shareObj.title = ''
   shareObj.path = ''
   shareObj.imageUrl = ''
}
return shareObj
}

 

  二、Navigator組件中的子元素也綁定了事件,點擊子元素觸發時,頁面會跳轉。android

  解決:子元素綁定事件時不要用bindtap,改用catchtapios

 

  三、獲取當前頁面的url(完整路徑)。寫成工具函數以下:json

function getCurrentPageUrlWithArgs(){
    var pages = getCurrentPages()    //獲取加載的頁面
    var currentPage = pages[pages.length-1]    //獲取當前頁面的對象
    var url = currentPage.route    //當前頁面url
    var options = currentPage.options    //若是要獲取url中所帶的參數能夠查看options
    var urlWithArgs = ''
    //拼接url的參數
    if (options) {
      urlWithArgs = url + '?'
      for(var key in options){
        var value = options[key]
        urlWithArgs += key + '=' + value + '&'
      }
    } else {
      urlWithArgs = url + ' '
    }
    urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length-1)
    return urlWithArgs
}

 

  四、小程序分頁數據限制:canvas

  常規的作法是,將每次新獲取的數據拼接到當前數組中去。這樣,對於數據量較小的狀況下是沒什麼問題的,可是若是數據量比較多,很容易就超出1024kb的限制。小程序

  那麼該如何緩解這種問題呢?這裏參照了百度小程序的解決方案,就是使用二維數組來解決。後端

this.setData({
  ['hotTodayList[' + curPage + ']']: res.list,  // curPage表示二維數組的下標,若是分頁是從1開始,則curPage等於當前頁減去1,若是分頁從0開始,則curPage就等於當前頁數
  pageNum: this.data.pageNum + 1,
  totalPage: totalPage,
})

  在頁面渲染的時候,就要使用兩個for循環來渲染數據了。 數組

<block wx:for="{{hotTodayList}}" wx:for-item="arrItem" wx:for-index="arrIndex">
  <block wx:for="{{arrItem}}" wx:for-item="item" wx:key="index" wx:for-index="index">
    // 須要渲染的頁面結構
  </block>
</block>

  注意:在刷新的時候要清空原數據,防止新數據與原數據衝突,如本例,直接hotTodayList = []就好了。服務器

  這雖然能解決在分頁數較多,單次設置數據較大的問題。可是若是單頁中後臺一次性返回的數據大於1024kb時,依然會出現問題的,特別是有商品sku這種狀況下,是很容易碰到的,因此仍是須要與後端協商一下,儘可能不要返回沒必要要的數據。

 

  五、小程序遇到了偶發性微信加密數據解密失敗的問題:

  在這一步的開發中,必定要按照這樣的順序 1. 小程序請求login,拿到code  ;2.而後小程序調用getuserinfo接口拿到encryptedData,iv,還有以前的code,而後傳給服務端;4.服務端拿到客戶端的encryptedData,vi還有sessionKey去解密獲得 unionId等用戶信息;否則就會出現這樣的問題,這種狀況偶然出現的緣由就是,在服務端還未去獲取sessionKey的時候就去調用了getuserinfo,有時候會比服務端快,有時候會比服務端慢,因此就出現了偶然性。

 

  六、小程序上線後打開出現了調試模式:

  這是由於在開發版本打開了調試模式,而後再用線上版本也會有。在開發版中關閉調試模式就行。好在這個只有本身有,用戶是沒有的。

 

  七、用戶長按二維碼進入小程序後,獲取二維碼中的參數失敗:

    

    以上是官方文檔給的說明。之因此失敗是由於二維碼只認scene字段,也就是用options.scene能夠獲取,二維碼中的這個參數不能隨便傳,不然雖然能進入到小程序,可是沒法獲取到想要的參數。

 

  八、小程序使用canvas畫圖,保存到本地:

  問題:使用網絡圖片時,在開發者工具上是沒問題的,能正常顯示,可是在真機上測試,發現圖片不顯示,開啓調試,發現也沒報錯。

  緣由:小程序canvas不支持在真機上繪製在線圖片。

  解決辦法:將在線圖片(網絡圖片)使用wx.getImageInfo方法轉換爲本地路徑,而後在使用canvas中的drawImage便可。注意:網絡圖片需先配置download域名才能生效

 

  九、小程序版本檢測更新:

可在onLaunch方法中調用以下方法
//
獲取小程序更新機制兼容 if (wx.canIUse("getUpdateManager")) { const updateManager = wx.getUpdateManager(); updateManager.onCheckForUpdate(function (res) { // 請求完新版本信息的回調 if (res.hasUpdate) { updateManager.onUpdateReady(function () { wx.showModal({ title: "更新提示", content: "新版本已經準備好,是否重啓應用?", success: function (res) { if (res.confirm) { // 新的版本已經下載好,調用 applyUpdate 應用新版本並重啓 updateManager.applyUpdate(); } } }); }); updateManager.onUpdateFailed(function () { // 新的版本下載失敗 wx.showModal({ title: "已經有新版本了喲~", content: "新版本已經上線啦~,請您刪除當前小程序,從新搜索打開喲~" }); }); } }); } else { // 若是但願用戶在最新版本的客戶端上體驗您的小程序,能夠這樣子提示 wx.showModal({ title: "提示", content: "當前微信版本太低,沒法使用該功能,請升級到最新微信版本後重試。" }); }

 

  十、小程序定時器之setInterval

  問題:例如點擊一個按鈕,調用服務端接口拿到截止時間與服務器當前時間,而後在彈窗中實現一個定時器。最初我是這麼實現的,直接一個setInterval完事兒,乍一看,徹底沒問題,但是當我關閉彈窗再次點擊按鈕時,發現彈窗中的定時器會運行的很快,沒啥規律,或者當我進到其餘頁面時,再回過頭來進入該頁面,發現定時器也會有相似問題,究其緣由,發現原來是定時器沒有及時清除搞的鬼。

  解決:關閉彈窗時,清除定時器。頁面執行onHide與onUnload生命週期時,也清除一遍定時器。而後順利解決了。

 

  十一、小程序之阻止遮罩層底下的頁面滑動(目前測的ios端沒問題,android端後續再測)

  問題:小程序自帶的遮罩層會默認阻止遮罩層底下頁面滑動,可是若是是咱們自定義的遮罩,底下的頁面是能夠滑動的,雖然無傷大雅,可是總感受怪怪的,因而網上查詢資料半天,最終找到了一種簡單粗暴的方法。特此記錄下。

  解決:爲遮罩層綁定catchtouchmove='preventD',preventD爲事件名,這個事件名能夠隨意取,事件裏面啥也不用寫,就能成功解決。

 

  十二、小程序分包加載:

  (1)、在app.json中配置以下:

{
  "pages": [
    "pages/index/index"
  ],
  "subPackages": [
    {
      "root": "package_a",
      "pages": [
        "pages/home/home"
      ]
    },
    {
      "root": "package_b",
      "pages": [
        "pages/home/home"
      ]
    }
  ],
  "tabBar": {
    "color": "#444",
    "selectedColor": "#fe4d4d",
    "backgroundColor": "#ffffff",
    "list": [
      {
        "pagePath": "pages/index/index",
        "text": "首頁",
        "iconPath": "pages/index/home.png",
        "selectedIconPath": "pages/index/home_select.png"
      },
      {
        "pagePath": "pages/prefer_goods/prefer_goods",
        "text": "拼好貨",
        "iconPath": "pages/prefer_goods/prefer_goods.png",
        "selectedIconPath": "pages/prefer_goods/prefer_goods_select.png"
      },
      {
        "pagePath": "pages/my/my",
        "text": "個人",
        "iconPath": "pages/my/my.png",
        "selectedIconPath": "pages/my/my_select.png"
      }
    ]
  },
  "window": {
    // 相關配置
  },
  "navigateToMiniProgramAppIdList": [
     // 所要跳轉的小程序appid
  ]
}

  (2)、與app.json同級目錄新建package_a目錄(該目錄下新建images目錄與pages目錄,而後pages目錄下像以前同樣正常操做)與package_b目錄(該目錄下新建images目錄與pages目錄,而後pages目錄下像以前同樣正常操做)

  (3)、上述操做完後,保存,而後會報錯,錯誤如:「pages *** 不該該在分包 subPackages[*] 中」。這個錯誤的緣由是經過編輯器右鍵添加page的話,主包中會自動加入page路徑,此時咱們再去建立新的分包若是沒有去掉主包路徑就會報錯。解決辦法就是去掉主包中的路徑便可。

 

  1三、繪製圓角矩形函數封裝(在安卓機上會有bug)

roundRectColor: function (context, x, y, w, h, r) {  //繪製圓角矩形(純色填充)
    context.save()
    if (w < 2 * r) {
      r = w / 2
    }
    if (h < 2 * r) {
      r = h / 2
    }
    context.beginPath()
    context.setFillStyle('#fff')   // 填充顏色爲白色
    context.setStrokeStyle('#fff')  // 描邊顏色爲白色
    context.moveTo(x + r, y)
    context.arcTo(x + w, y, x + w, y + h, r)
    context.arcTo(x + w, y + h, x, y + h, r)
    context.arcTo(x, y + h, x, y, r)
    context.arcTo(x, y, x + w, y, r)
    context.fill()
    context.closePath()
  }

  可以使用arc與lineTo方法

roundRectColor: function (context, x, y, w, h, r, c) {  //繪製圓角矩形(純色填充)
    context.save()
    if (w < 2 * r) { r = w / 2; }
    if (h < 2 * r) { r = h / 2; }

    context.beginPath();
    context.setStrokeStyle('#fff');
    context.setFillStyle('#fff');

    context.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5);
    context.moveTo(x + r, y);
    context.lineTo(x + w - r, y);
    context.lineTo(x + w, y + r);

    context.arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2);
    context.lineTo(x + w, y + h - r);
    context.lineTo(x + w - r, y + h);

    context.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5);
    context.lineTo(x + r, y + h);
    context.lineTo(x, y + h - r);

    context.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI);
    context.lineTo(x, y + r);
    context.lineTo(x + r, y);

    context.fill();
    context.stroke();
    context.closePath();
   
  }

  

  1四、小程序中使用rsa加密:

  下載wx_rsa.js文件,在頁面中引入rsa.js文件。如:const RSA = require('../../utils/wx_rsa.js') 

let publicKey = ''                                      // 加密密鑰
let encrypt_rsa = new RSA.RSAKey()
encrypt_rsa = RSA.KEYUTIL.getKey(publicKey)
let encStr = encrypt_rsa.encrypt(pass)                  // pass爲須要加密的內容
encStr = RSA.hex2b64(encStr);

如須要進行encode編碼,則pass = encodeURI(encStr)便可
相關文章
相關標籤/搜索