1.前言
記錄開發小程式過程中的花式填坑
2.使用 wx.getImageInfo 獲取圖片連結
如果src 引數對應的是一張不存在圖片,那麼在ios下面會報錯,阻止下面的業務程式碼執行。在安卓了有相容處理,只是不存在的圖片,無法獲取。下面的業務程式碼能獲取。
wx.getImageInfo({
src: src,
success: function (res) {
resolve(res)
},
fail:function () {
reject()
}
});
複製程式碼
3.input元件 confirm 方法觸發2次
以下程式碼sendCommen方法會觸發2次
<scroll-view>
<input confirm-type="send" @confirm="sendCommen" />
</scroll-view>
複製程式碼
解決方法
<!--將input元件移出scroll-view-->
<scroll-view></scroll-view>
<input confirm-type="send" @confirm="sendCommen" />
複製程式碼
4.scroll-view裡元素定位問題
在scroll-view元件裡面用fixed定位在ios下元素會跟著scroll-view滾動,出現佈局異常
儘量不要在scroll-view裡面使用定位
5.live-player 新增loading效果
只能用cover-view、cover-image蓋在live-player
- 使用gif圖片無動畫效果
- 無法使用css animation動畫,否則動畫會出現異常
- wx.createAnimation 同上
建議:使用文字loading效果
let _d = '.'
this.timing = setInterval(() => {
this.$apply(() => {
this.loadingText = '載入中,請稍後' + _d
})
if(_d.length < 3) {
_d += '.'
} else {
_d = '.'
}
}, 500)
複製程式碼
6.swiper滑動出現卡頓
請嘗試以下兩種方法
6.1 方法一
display-multiple-items設定為true
6.2 方法二
如果在 bindchange 的事件回撥函式中使用 setData 改變 current 值,則有可能導致 setData 被不停地呼叫,因而通常情況下請在改變 current 值前檢測 source 欄位來判斷是否是由於使用者觸控引起。
if (e.detail.source === 'touch') {
this.currentTab = e.detail.current;
}
複製程式碼
7.強制授權步驟
7.1檢測是否授權
app.wepy
// 檢視是否授權
wx.getSetting({
success (res){
if (res.authSetting['scope.userInfo']) {
// 已授權,獲取使用者最新資訊
console.log('user had auto-auth');
that.getUserInfo();
}else {
//未授權,跳轉去授權頁面強制授權
console.log('user has no auto-auth');
// 注意:這裡使用navigateTo跳轉,否則授權頁getCurrentPages獲取不到頁面資訊
wx.navigateTo({
url:'/pages/auth'
})
}
}
});
複製程式碼
7.2獲取上一個頁面資訊並銷燬其他頁面
auth.wepy
onLoad() {
// 獲取上一個頁面
let _prevPage = getCurrentPages().slice(-2)[0]
// 處理死迴圈
if (!this.$parent.globalData.prevPage) {
// 儲存上個頁面資料
this.$parent.globalData.prevPage = {
route: _prevPage.route,
options: _prevPage.options
}
// 清空其他頁面,防止退出授權頁
wx.reLaunch({
url: '/pages/auth'
})
}
}
複製程式碼
7.3授權成功後,跳回上一個頁面
auth.wepy
<button open-type="getUserInfo" bindgetuserinfo="uf">微信授權登入</button>
uf(e) {
if(e.detail.errMsg === 'getUserInfo:ok') {
// 拼接上一個頁面引數和路徑並跳轉
wx.redirectTo({
url: _this.createURL('/' + _this.$parent.globalData.prevPage.route, _this.$parent.globalData.prevPage.options)
})
}
}
/**
* @description 拼接路徑
* @param url 路徑
* @param param 引數
*/
createURL(url, param) {
var urlLink = '';
for (let key in param) {
var link = '&' + key + "=" + param[key];
urlLink += link;
}
urlLink = url + "?" + urlLink.substr(1);
return urlLink.replace(' ', '');
}
複製程式碼
8.輸入框內容被鍵盤擋住怎麼辦
8.1方法一
設定 adjust-position預設就是為true, 個別機型無法上推頁面
<input adjust-position />
複製程式碼
8.2方法二
//設定 adjust-position為false,監聽獲取焦點事件
<input adjust-position="{{false}}" @focus="onFocus" style="{{isFocus ? 'transform:translate3d(0, ' + keyboardHeight + ', 0)' : 'transform:translate3d(0,0,0)'}}" />
//內容上推
<scroll-view style="{{isFocus ? 'transform:translate3d(0, ' + keyboardHeight + ', 0)' : 'transform:translate3d(0,0,0)'}}">
//獲取焦點
focusFn(e) {
// 設定當前狀態為獲取焦點狀態
this.isFocus = true
// 獲取鍵盤高度
this.keyboardHeight = -e.detail.height + 'px'
}
複製程式碼
9.長按點選事件
9.1方法一
使用官方給出的長按點選事件longpress事件進行實現
wxml中為圖片繫結點選事件,事件型別為長按(手指觸控後,超過350ms立即觸發該事件)
<image bindlongpress='longPress' src='{{userInfo.avatarUrl}}'></image>
longPress:function(){
wx.showModal({ //使用模態框提示使用者進行操作
title:'警告',
content:'你將清空小程式本地所有快取!',
success:function(res){
if(res.confirm){ //判斷使用者是否點選了確定
wx.clearStorageSync();
}
}
})
}
複製程式碼
9.1方法二
根據官方給出的touchstart(觸控開始時間)和touchend(觸控結束時間)事件,設計可以自定義長按時長的點選事件
<image bindtouchstart='touchStart' bindtouchend='touchEnd' bindtap='pressTap'src="{{userInfo.avatarUrl}}"></image>
touchStart:function(e){
varthat=this;
that.setData({
touchStart:e.timeStamp
})
},
touchEnd:function(e){
varthat=this;
that.setData({
touchEnd:e.timeStamp
})
},
pressTap:function(){
varthat=this;
vartouchTime=that.data.touchEnd-that.data.touchStart;
if(touchTime>1000){ //自定義長按時長,單位為ms
wx.showModal({
title:'警告️',
content:'你將清空小程式本地所有快取!',
success:function(res){
if(res.confirm){
wx.clearStorageSync();
}
}
})
}
}
複製程式碼
10.下載圖片
下載圖片功能,下載的域名必須是https,並且在小程式後臺設定downloadFile白名單;
11.微信小程式動畫中如何將rpx轉化px
1、需要藉助的API:wx.getSystemInfoSync();
通過API可獲取的值:
// 在 iPhone6 下執行:
var systemInfo = wx.getSystemInfoSync();
console.log(systemInfo.windowWidth); // 輸出 375(單位 px)
// 在 iPhone6 Plus 下:
var systemInfo = wx.getSystemInfoSync();
console.log(systemInfo.windowWidth); // 輸出 414 (單位 px)
複製程式碼
2、px與rpx之間轉換的公式:px = rpx / 750 * wx.getSystemInfoSync().windowWidth;
動畫中如何使用:
//假設我想向右平移300rpx,動畫程式碼如下:
this.animation.translateX(300 / 750 * systemInfo.windowWidth).step()
複製程式碼
這樣在所有機型上都可以進行適配。
12.獲取自定義頂部導航高度
// let totalTopHeightSet = {
// 'iPhone': 64,
// 'iPhone X': 88,
// 'android': 68
// }
wx.getSystemInfo({
success: function(res) {
let totalTopHeight = 68
if (res.model.indexOf('iPhone X') !== -1) {
totalTopHeight = 88
} else if (res.model.indexOf('iPhone') !== -1) {
totalTopHeight = 64
}
//狀態列高度
vm.globalData.statusBarHeight = res.statusBarHeight
// 自定義導航高度
vm.globalData.titleBarHeight = totalTopHeight - res.statusBarHeight
},
failure() {
vm.globalData.statusBarHeight = 0
vm.globalData.titleBarHeight = 0
}
})
複製程式碼
12.轉發跳轉導致ios頁面卡死問題
在onShareAppMessage的返回值return之前進行redirectTo跳轉頁面,經過真機測試發現在安卓機上可以分享後跳轉到對應的頁面,但是在ios機上,吊起分享組建後,ios上頁面會直接卡死。
解決方法:
// onShareAppMessage 設定個狀態,根據這個狀態 是否在onShow使用redirectTo
onShow() {
if(this.isRedired) {
// 在這跳轉
}
}
onShareAppMessage() {
this.isRedired=true;
}
複製程式碼