1. 程式人生 > >微信小程式踩坑記錄

微信小程式踩坑記錄

  最近開發了一款微信小程式,在開發過程中遇到了一些微信小程式的坑,記錄下來,希望對後邊開發小程式的同學有點幫助。後期開發過程如果有新的踩坑記錄,也會相應的更新在改文件中。

1、畫素值與單位之間不能有空格

  微信小程式的樣式存放在.wxss檔案,畫素單位用rpx,官方文件有如下描述。

rpx(responsive pixel): 可以根據螢幕寬度進行自適應。規定螢幕寬為750rpx。如在 iPhone6 上,螢幕寬度為375px,共有750個物理畫素,則750rpx = 375px = 750物理畫素,1rpx = 0.5px = 1物理畫素。

踩坑點:畫素值和畫素單位之間不能有空格,否則不起作用。即10rpx 能被識別;10 rpx則不能被識別;部分編輯器格式化之後會在數值和單位間有空格(webstorm即使如此)。

2、回撥函式解決app.js 與 page之間因非同步介面造成資料不同步問題

  小程式在初始化時會執行app.js。通常微信登入小程式之後,根據具體的業務場景,需要判斷小程式是否在業務中繫結。如果繫結則直接進入首頁,如果沒有繫結則進入繫結頁面。
  根據以上場景,我們需要在app.js中呼叫業務介面判斷,是否存在繫結關係。程式碼大致如下: 通過呼叫wx.login()介面,獲取返回的code值,然後將改code 傳遞給後端,查詢微信與業務的繫結關係。

onLaunch: function (options) {
    wx.login({
        success: res => {
            //獲取微信返回的code
            let code = res.code,
            
            //呼叫業務介面
            wx.request({
                url: '微信是否繫結過業務',
                data: {code, ... 其他引數},
                method: 'POST',
                success: res => {
                    /*因為介面是非同步資料,可能Page.onLoad()方法先執行*/
                    let response = res.data
                    if (this.userInfoReadyCallback) {
                        this.userInfoReadyCallback(response)
                    } else {
                        commonUtil.initPage(response)
                    }
                }
            });
        }
    })
},

   如果查詢微信和業務有繫結,則應該會返回實際業務中的 token,且將token等相關資訊儲存在storage中,以便後續使用;如果沒有繫結關係,則跳轉到繫結關係的頁面,其中initPage(),就是做此功能使用。

  通常在我們在首頁命名為index,在index頁面中,一般有如下程式碼:根據微信登入的token值,查詢具體的業務資料。

   onShow: function (options) {
        if (!util.getAppStoken()) {
            app.userInfoReadyCallback = res => {
                commonUtil.initPage(res);
            }
        } else {
            this.queryRole();
        }
    },

  然而存在一個問題,按照正常的小程式註冊順序,app中onLaunch先執行,然後再執行page中onShow(onLoad)方法。但是onLaunch方法中存在非同步的介面,因此page中可能在介面返回資料之前就已經執行。此時page頁面不一定能準確拿到onLaunch介面返回的token資料

   因此如上述程式碼所示,在page中,首先判斷是否能拿到token,如果拿不到,給app例項添加回調函式,同時在onLaunch介面中判斷是否存在該回調。如果能拿到token,則直接執行業務介面,根據token查詢業務資料。

   實際的執行過程 :

   app:onLaunch — index:onShow — index:獲取不到token — index:新增app 回撥 — app:介面返回資料 —app:執行回撥

   (1)未繫結關係 — 繫結頁面 — 繫結成功返回 token — 進去index — index:能獲取token — 查詢業務

   (2)已繫結關係 — 返回 token — --- 進去index — index:能獲取token — 查詢業務

3、web-view內嵌H5,不能動態修改H5路徑

  微信小程式支援通過web-view方式內嵌H5,其中src屬性指向網頁的連結。如果該連結地址不是靜態資料,而是從後端獲取的。如果直接如下寫法:

<web-view src="{{src}}"></web-view>

Page({
    data:{
        src:""
    }
    
    onLoad:function(){
        ......
        this.setData({
            src: '介面獲取的src'
        })
    }
})

   則會出現空白頁面,檢視此時data中的src資料,也確實更新到介面返回的資料。為什麼跳轉不進去正確的頁面啦。

   原因分析:小程式在解析時,遇到web-view標籤時,就會立即跳轉到對應的src屬性的連結。此時小程式已經開啟H5頁面,但是小程式宣告週期會繼續執行,因此會出現AppData中資料發生改變,而H5中沒有對應的引數。因此必須在初始化給出完整的連結地址(包含url引數)。

   解決方法: 將web-view封裝成元件,新增一箇中間頁面redirectH5,在這個中間頁面中,onLoad方法中可以處理src,引用,並將src作為引數傳入。程式碼如下:

<!--redirect-->
<web-view src="{{src}}"></web-view>

Component({
  properties: {
      src: {
          type: String,
          value: '',
          observer: function (newval, oldval) {
          }
      },
  }
})


<!--redirectH5-->
<redirect src="{{redirectUrl}}"></redirect>

Page({
    data:{
        src:""
    }
    
    onLoad:function(){
        ......
        this.setData({
            src: '介面獲取的src'
        })
    }
})

  原理解析:猜測原因是,頁面的onLoad方法在元件的created方法之前執行。翻看官方文件,沒有檢視到相關的說明,如有那位同學看到了,可以分享給我。

4、web-view會覆蓋其他元件

  在微信小程式嵌入H5過程中,需要對H5的連結進行控制,防止外網或者非法域名的連結。因此最初設想在redirectH5中如下編碼。

<view>
    <view wx:if="{{isIllegalUrl}}" class="illegal-url">
        <view class="illegal-text">域名配置不合法,請聯絡運營人員</view>
        <view bindtap="goIndex" >
            <button class="back-index">返回首頁</button>
        </view>
    </view>
    <redirect src="{{redirectUrl}}" wx:else></redirect>
</view>

  當傳入非法域名的時候,確實如設想一樣,出現返回首頁的按鈕,但是發現按鈕點選無效。初步懷疑是元件中web-view作祟。官方穩定如下解釋:

每個頁面只能有一個,會自動鋪滿整個頁面,並覆蓋其他元件

5、開發過程中,可以設定不校驗合法域名、業務域名

  小程式介面呼叫必須是域名訪問的,且必須在小程式的配置中心新增合法域名、業務域名等。給除錯帶來麻煩,但是微信小程式的開發工具裡,可以設定不校驗域名。在本地開發的時候,可以通過呼叫IP聯調。
            在這裡插入圖片描述

6、授權獲取使用者資訊需要按鈕觸發

  在之前的微信小程式版本中,通過wx.authorize({scope: “scope.userInfo”}),就會彈窗詢問使用者是否授權獲取使用者頭像、暱稱等基本資訊。最新版本的微信小程式文件,已經更改:
無法彈出授權視窗

注意:wx.authorize({scope: “scope.userInfo”}),無法彈出授權視窗,請使用

為優化使用者體驗,使用 wx.getUserInfo 介面直接彈出授權框的開發方式將逐步不再支援。從2018年4月30日開始,小程式與小遊戲的體驗版、開發版呼叫 wx.getUserInfo 介面,將無法彈出授權詢問框,預設呼叫失敗

  如果需要獲取使用者資訊,使用button元件的open-type='getUserInfo’提供的開放能力,此外還需要設定bindgetuserinfo對應的方法。具體實現如下

<button open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="onGotUserInfo">獲取使用者資訊</button>

//使用者點選該按鈕時,會返回獲取到的使用者資訊,回撥的detail資料與wx.getUserInfo返回的一致
 onGotUserInfo: function(e) {
    console.log(e.detail.errMsg)
    console.log(e.detail.userInfo)
    console.log(e.detail.rawData)
  }
  

7、http支援不友好

   在微信小程式中引用的圖片、連結等如果http不能正常顯示或者訪問,可以嘗試一下https。專案經驗告訴我,微信對http支援並不友好。

   持續更新中。。。。。。

相關推薦

程式記錄

  最近開發了一款微信小程式,在開發過程中遇到了一些微信小程式的坑,記錄下來,希望對後邊開發小程式的同學有點幫助。後期開發過程如果有新的踩坑記錄,也會相應的更新在改文件中。 1、畫素值與單位之間不能有空格   微信小程式的樣式存放在.wxss檔案,畫素單位用rp

程式—本地快取

同一個微信使用者,同一個小程式 storage 上限為 10MB。 1.wx.setStorageSync(KEY,DATA)  將data 同步儲存在本地快取中指定的 key 中,會覆蓋掉原來該 key 對應的內容。 var userInfo = res.data.da

程式–設定cookie保持session

由於每次wx.request()都會先經過微信服務端再到伺服器端,所以每一次request都會建立一個新的session。並且微信小程式是沒有cookie機制的,要維持會話需要自己來儲存cookie,並且請求的時候加上帶有sessionid的cookie。 客戶端向服務端發起請求時,sessio

程式記錄 ------- canvas 生成分享到朋友圈帶程式碼的圖片

最近做了一個問卷類的小程式,其中的結果頁想讓使用者進行朋友圈分享轉發,網上搜索資料,得出解決思路,用 canvas 將頁面繪製生成圖片,然後儲存到手機相簿,最終效果如下: 在這裡我只寫頁面裡關於 canvas 生成圖片並進行儲存這個流程的相關程式碼,並且會

程式記錄

本文由本人簡書搬遷至此,並做小幅修改。 老闆要讓做個小程式,並且很著急。於是邊學邊幹開始做微信小程式。 過程中遇到不少坑,前期時間太緊沒有記錄,後期憑記憶簡單記一下,防止再次入坑。 1.開發工具中,本地資原始檔名(資料夾路徑未測)對大小寫不敏感,拼錯仍然能正確顯示,但在真機上敏感,拼錯不

程式 實錄

最近幾個月工作飽和度較高,寫了一些小程式相關資料都在公司內網wiki中。 正好有朋友想做小程式相關,想看些資料。趁著 這個契機,把文章發出來給大家分享一下。 文章簡陋,勿噴。 開發前 需要與產品商榷的頁面細節 序號

遊戲記錄(二)

微信視訊元件 這次是關於視訊元件的,creator的視訊元件在小遊戲中是沒有用的,只能使用小遊戲自帶的元件。使用小遊戲Video的時候需要注意三點: 座標系的區別:微信使用的是UI座標系,以左上角為(0,0)點,x軸向右,y軸向下。而cocos的世界座標以左下角為(0,0)點,x軸向

程式總結

1,滑動頁面的時候會出現留白。解決:最外層套一個scroll,不設定x、y滑動。注意距離要撐開,內層要有一個大的view,給它一個小margin-top 2,button出現多餘的邊框。解決:button::after設定border為none 3,自定義元件。自定義元件如果是page({}

程式支付提示商戶未開通支付許可權

繼上次踩坑事件後 我們現在API祕藥都是採用數字+小寫字母 後面不多久公司就成為了微信服務商 工作起來 效率提高不少 然鵝我今天又踩了一個坑 給客戶開通了微信支付客戶不給賬號給我登入 拿不到裡面的一些資料 和APPID授權啥的 都是指導客戶開通 這些弄完之後 測試小程式支付

程式日誌(二)

indexOf 在wxml檔案中不能使用 Object.keys() toString() indexOf() ; 其中indexOf()方法在wxml中怎麼樣都返回undefined; textarea textarea在小程式中算是一個比較大的坑了;

程式記錄

坑一:wx:for迴圈,2層資料可以迴圈出來,但陣列物件的屬性迴圈不出來; 錯誤程式碼: <block  wx:for="{{arr}}" wx:key="{{index}}">   <view>{{item.attributes.name}}<

程式(1):wx.showModal模態對話方塊中content換行

問題:wx.showModal 對話方塊內容不能換行? 如上圖所示,模態對話方塊中content是沒有換行的,但是我們需求中有需要換行提醒的業務,那怎麼辦呢?官方API中並沒有告訴我們怎麼做! 解決方案:使用“\r\n”換行 原始碼 wx.showModal({

程式——專案內資料夾刪除不掉

想要刪publishTask資料夾,在IDE裡刪沒反應,去檔案資源管理器刪提示需要管理員許可權, 太鬼扯了,原來因為要刪的資料夾裡有巢狀一層資料夾,所以禁止刪除。要先刪掉裡層資料夾,才可以刪除外層。換句話說,想要刪除的資料夾要保證不包

程式- tabBar.list[3].selectedIconPath 大小超過 40kb

重新啟動微信小程式編輯器的時候遇到了這樣的一個問題:tabBar.list[3].selectedIconPath 大小超過 40kb微信小程式開發的過程之中總會出現這樣或者那樣的錯誤,需要我們耐心的去尋找,仔細檢視和百度查詢之後,發現了原因:其中有一張圖片,替換的時候沒有注

程式—使用者登入介面

最近做的一個專案有涉及到使用者登入。微信小程式的使用者登入在我看來有兩種,一種是需要用微信提供的使用者身份標識,簡單地說就是小程式的登入者就是使用這個小程式的微信使用者,還有一種是小程式和伺服器之間有自己的一套使用者唯一標識,類似於員工id這種,這種就不需要獲取微信的登陸憑證

程式 之JSON.parse ()轉換失敗問題

微信小程式:json、map、字串轉換 JSON.parse (<anonymous>)轉換失敗,可以使用微信小程式快取機制解決 /*****index.js*****/ formSubmit: function (e) { wx.setStorage

程式之路--01 元件層級過高

問題描述 我在開發小程式的過程中,遇到video,textarea等元件層級過高,其他元素無法遮蓋這些元件,讓人抓狂。 案例1 textarea元件元素過高,當有toast彈出時,文字浮於上方,效果如圖所示: 我們看到textarea元件文字

程式日記1——呼叫授權視窗

0. 引言   微信小程式為了優化使用者體驗,取消了在進入小程式時立馬出現授權視窗。需要使用者主動點選按鈕,觸發授權視窗。   那麼,在我實踐過程中,出現了以下問題。 1. 無法彈出授權視窗 2. 希望在使用者已經授權的情況下,不顯示按鈕 1. 具體實現   app.js的onLaunch

程式自動化,記錄趟過的

![](https://upload-images.jianshu.io/upload_images/16753854-b60356df3dca1aba.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 專案思想:關鍵字+資料驅動混合測試

程序

log icon spa utils for not duration 是我 問題 setData function is not defined 這個問題只會出現在 wx.request(OBJECT)中 具體替代嗎吧!寫日誌真的不是我的強項 //logs