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