小程序開發(fā)問題

小程序開發(fā)問題

一、常見問題

1、navigator點(diǎn)擊無效果(已解決)

因為跳轉(zhuǎn)到tab欄沖突,加上open-type="switchTab"
<navigator url="/page/index/index" open-type="switchTab"><navigator>
或者使用編程式導(dǎo)航wepy.switchTab(),跳轉(zhuǎn)tab欄

wepy.switchTab({
     url:'/pages/tabs/home'
 })

2、頁面跳轉(zhuǎn)微信付款碼(待解決)

小程序有個點(diǎn)擊使用微信支付。
微信的文檔是wx.openOfflinePayView({})
但是此功能為內(nèi)測,暫不可用

3、小程序下拉刷新(已解決)

在當(dāng)前頁面配置,wepy中是配置config

config = {
     enablePullDownRefresh:true,
     backgroundTextStyle:'dark'
  }
函數(shù)中
onPullDownRefresh(){
  請求數(shù)據(jù)成功后停止刷新動作
  wx.stopPullDownRefresh()
}

4、去除button,input默認(rèn)樣式

說明:原理:hover-class樣式顯示的原理是點(diǎn)擊時把樣式加到class的樣式中,
沖突時,誰在后面就顯示誰!

<button class="btn" hover-class="btn-hover" disabled="{{flagbtn}}"
bindtap="subMessUser" >提交</button>
-------------------wxss----------------------------
button::after{
border:none;
}
button{
box-sizing:content-box!important;// 原先是border-box
overflow:none!important;// 原先是hiddren
border-radius:0;
background-color:#fff;
}

//按下時的樣式
.btn-hover{
color:#fff;
background-color:#fff !important;
}

//禁用后的樣式
button[disabled] {
background-color:#fff!important;
}

input{
outline:none;
border:none;
list-style:none;
}

5、wx:for wx:key 相關(guān)

wx:for 需要攜帶wx:key,如不提供 wx:key,會報一個 warning, 如果明確知道該列表是靜態(tài),或者不必關(guān)注其順序,可以選擇忽略。

在組件上使用 wx:for 控制屬性綁定一個數(shù)組,即可使用數(shù)組中各項的數(shù)據(jù)重復(fù)渲染該組件。

默認(rèn)數(shù)組的當(dāng)前項的下標(biāo)變量名默認(rèn)為 index,數(shù)組當(dāng)前項的變量名默認(rèn)為 item

<viewwx:for="{{array}}">
{{index}}: {{item.message}}
</view>

使用 wx:for-item 可以指定數(shù)組當(dāng)前元素的變量名,
使用 wx:for-index 可以指定數(shù)組當(dāng)前下標(biāo)的變量名:

<viewwx:for="{{array}}"wx:for-index="idx"wx:for-item="itemName">
{{idx}}: {{itemName.message}}
</view>

wx:key是用來告訴程序按照某個key去排序這個組件,例如wx:key="item.id"。id為唯一值,而如果沒有這個wx:key的話,當(dāng)渲染時框架會去查找這個"key",造成資源的浪費(fèi)。以及報警告。

wx:key=" *this" 在沒有唯一值的時候,可以使用此來替代
保留關(guān)鍵字 *this 代表在 for 循環(huán)中的 item 本身,這種表示需要 item 本身是一個唯一的字符串或者數(shù)字

?

1.需要wx:key的情況

//列表中項目的位置會動態(tài)改變或者有新的項目添加到列表中
//希望列表中的項目保持自己的特征和狀態(tài)
(如 <input/> 中的輸入內(nèi)容,<switch/> 的選中狀態(tài))

2.可不需要wx:key的情況

如果明確知道該列表是靜態(tài),或者不必關(guān)注其順序,可以不用加wx:key
轉(zhuǎn)載:https://www.cnblogs.com/chenzhiran/p/11160702.html

6、小程序分包加載(例:wepy)

微信 6.6.0 版本開始支持分包加載,而對于低于這個版本的客戶端,我們做了兼容處理,開發(fā)者不需要對老版本微信客戶端做兼容。

對于老版本的客戶端,編譯后臺會將所有的分包打包成一個整包,老版本的客戶端依然按照整包的方式進(jìn)行加載。
目前小程序分包大小有以下限制:
整個小程序所有分包大小不超過 16M
單個分包/主包大小不能超過 2M
對小程序進(jìn)行分包,可以優(yōu)化小程序首次啟動的下載時間,以及在多團(tuán)隊共同開發(fā)時可以更好的解耦協(xié)作。
方法:
在pages同目錄下創(chuàng)建其他分包,包名為packageA,packageB.....

如圖
Snipaste_2019-09-11_17-58-23.png
app.wpy中配置config
pages: [
'pages/tabs/home',
'pages/tabs/coupon',
'pages/other/register',
'pages/other/mydetail'
   ],
subPackages: [
     {
      root:'packageA',
      pages: ['pages/other/mycoupon','pages/other/coupondetail']
     },
     {
      root:'packageB',
      pages: ['pages/other/order','pages/other/information']
     }
   ]

7、wepy雙向數(shù)據(jù)綁定this.$apply()

因為數(shù)據(jù)更新是異步操作,無法在第一時間同步賦值,所以需要這個方法
在你為data里面的數(shù)據(jù)進(jìn)行綁定的時候,是需要的。
比如data里面你定義了一個x='',然后你在自定義的方法里面用this.x=200之后,需要用this.$apply()來進(jìn)行數(shù)據(jù)綁定。這樣你在view中綁定data中的x變量時,才會有200,不然就是空。
不過有個前提,method里面的方法是不用這個的,但methods里面只能放bindtap這類方法,所以你自己定義的其他方法,或者寫在onshow里面,就必須得用this.$apply()。

8、微信小程序圖片寬度100%,高度自適應(yīng)

做法如下:
樣式設(shè)置寬度100%,
添加屬性 mode="widthFix",
即可實現(xiàn)!

9、小程序觸摸事件

WXML的冒泡事件列表:
類型 觸發(fā)條件
touchstart 手指觸摸動作開始
touchmove 手指觸摸后移動
touchcancel 手指觸摸動作被打斷,如來電提醒,彈窗
touchend 手指觸摸動作結(jié)束
tap 手指觸摸后馬上離開
longtap 手指觸摸后,超過350ms再離開
注:除上表之外的其他組件自定義事件如無特殊申明都是非冒泡事件,如<form/>
的submit事件,<input/>的input事件,<scroll-view/>的scroll事件,(詳見各個組件)

10、小程序獲取手機(jī)號登錄注冊出現(xiàn)解密失敗

當(dāng)前小程序邏輯是
-getuserInfo-getPhoneNumber-wx.login-請求服務(wù)器登錄/注冊
但是獲取getPhoneNumber的加密信息之前就必須wx.login


官方說法:
使用方法
需要將 button 組件 open-type 的值設(shè)置為 getPhoneNumber,當(dāng)用戶點(diǎn)擊并同意之后,可以通過 bindgetphonenumber 事件回調(diào)獲取到微信服務(wù)器返回的加密數(shù)據(jù), 然后在第三方服務(wù)端結(jié)合 session_key 以及 app_id 進(jìn)行解密獲取手機(jī)號。
注意
在回調(diào)中調(diào)用 wx.login 登錄,可能會刷新登錄態(tài)。此時服務(wù)器使用 code 換取的 sessionKey 不是加密時使用的 sessionKey,導(dǎo)致解密失敗。建議開發(fā)者提前進(jìn)行 login;或者在回調(diào)中先使用 checkSession 進(jìn)行登錄態(tài)檢查,避免 login 刷新登錄態(tài)。


請求邏輯反了,所以code出現(xiàn)無效的情況
正確邏輯-wx.login--getuserInfo-getPhoneNumber-請求服務(wù)器登錄/注冊

11、webSocket 實現(xiàn)聊天的技術(shù)點(diǎn)

詳見chat/chat.js
使用websocket將小程序和服務(wù)器建立長連接,目的是能夠?qū)崟r收發(fā)消息
再利用接口保存聊天消息
websocket地址實例
url = 'wss://*********.com/wss/ws/webSocketServer?token='+this.openid

12、小程序wepy分包報錯---

總是提示"pages/XX/XX" has not been registered yet?
安裝插件
npm install wepy-cli@1.6.1-alpha4 -g
然后刪除依賴包和dist文件后重新編譯

13、小程序畫布繪制圖片無法正常顯示

由于 canvas標(biāo)簽 加了個hidden部分手機(jī) wx.canvasToTempFilePath 走fail canvasToTempFilePath:fail:create bitmap failed"
解決辦法:畫布加transfrom right:-10000000,然后將生成的圖片顯示在另一個和畫布同大小的標(biāo)簽上
14、小程序樣式兼容性問題
input:text-align:end/right,無效,需給input設(shè)置寬度
二、小程序封裝工具函數(shù)
github鏈接工具庫
------------------tool-------------------------------------

time---time.js 時間戳轉(zhuǎn)時間字符串

canvas---barcode.js

    qrcode.js

    tool.js 小程序畫布,二維碼,條形碼

    wxqrcode.js 畫布轉(zhuǎn)base64圖片緩存地址

                (解決小程序二維碼在華為手機(jī)不顯示問題)

wxcode_base64.js內(nèi)有說明條碼轉(zhuǎn)圖片的方法

base64.js 加密的工具

baseApi.js 小程序封裝api工具

request.js 小程序發(fā)請求工具

wxchat_time wxchattime.js/wxchattime2.js 時間戳轉(zhuǎn)微信聊天格式

------------------wxParse-------------------------------------

商品詳情頁---html轉(zhuǎn)小程序頁面格式

?

1、時間戳轉(zhuǎn)聊天和表單相關(guān)時間格式

三、小程序開發(fā)抽離并封裝的規(guī)范
說明:抽離和封裝的目的是便于二次開發(fā)修改功能點(diǎn)

壓縮和復(fù)用代碼,減少不必要的代碼量

?

四、小程序登錄邏輯
微信小程序獲取用戶信息并保存登錄狀態(tài)詳解

?

微信小程序的運(yùn)行環(huán)境不是在瀏覽器下運(yùn)行的。所以不能以cookie來維護(hù)登錄態(tài)。下面我就來說說我根據(jù)官方給出的方法來寫出的維護(hù)登錄態(tài)的方法吧。

?

一、登錄態(tài)維護(hù)
?

官方的文檔地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject

?

通過 wx.login() 獲取到用戶登錄態(tài)之后,需要維護(hù)登錄態(tài)。開發(fā)者要注意不應(yīng)該直接把 session_key、openid 等字段作為用戶的標(biāo)識或者 session 的標(biāo)識,而應(yīng)該自己派發(fā)一個 session 登錄態(tài)(請參考登錄時序圖)。對于開發(fā)者自己生成的 session,應(yīng)該保證其安全性且不應(yīng)該設(shè)置較長的過期時間。session 派發(fā)到小程序客戶端之后,可將其存儲在 storage ,用于后續(xù)通信使用。

?

從上圖可以看出。當(dāng)我們通過wx.login()獲取code的后,發(fā)送給我們的服務(wù)器,然后去請求微信服務(wù)器換取得到對應(yīng)的openid與session_key,openid是該用戶在小程序中的唯一標(biāo)識用于模板通知之類的。session_key就是用來解密用戶的敏感信息。unionid之類的。unionid是微信用戶在所有微信平臺下的唯一標(biāo)識。下面我會講解一下如何得到。

?

?

以上就是我的實現(xiàn)方法。調(diào)用wx.login()得到code后請求服務(wù)器獲取openid與session_key緩存在服務(wù)器當(dāng)中。其中生成一個隨機(jī)數(shù)為key,value為openid與session_key。然后返回到小程序通過wx.setStorageSync('LoginSessionKey',得到的隨機(jī)數(shù)key)緩存在小程序當(dāng)中。每當(dāng)我們?nèi)フ埱蠓?wù)器時帶上LoginSessionKey即可給服務(wù)器讀取從而判斷用戶是否在登錄。是不是很簡單呢?

?

二、用戶數(shù)據(jù)的加解密
?

通過wx.login()登錄之后。我們可以通過wx.getUserInfo()獲取用戶信息。其中一些不敏感的信息在返回的 result中的userInfo里。如想要獲取敏感信息。openid,unionid之類的。則需要從密文中去解密得到。

?

而密文則在encryptedData這個字段當(dāng)中。我們?nèi)フ埱笪覀兎?wù)器去解密然后得到敏感信息后則可以保存起來。

?

加密數(shù)據(jù)解密算法

?

接口如果涉及敏感數(shù)據(jù)(如wx.getUserInfo當(dāng)中的 openId 和unionId ),接口的明文內(nèi)容將不包含這些敏感數(shù)據(jù)。開發(fā)者如需要獲取敏感數(shù)據(jù),需要對接口返回的加密數(shù)據(jù)( encryptedData )進(jìn)行對稱解密。 解密算法如下:

?

對稱解密使用的算法為 AES-128-CBC,數(shù)據(jù)采用PKCS#7填充。

對稱解密的目標(biāo)密文為 Base64_Decode(encryptedData),

對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節(jié)

對稱解密算法初始向量 iv 會在數(shù)據(jù)接口中返回。

微信官方提供了多種編程語言的示例代碼(點(diǎn)擊下載)。每種語言類型的接口名字均一致。調(diào)用方式可以參照示例。

?

這時候我們通過小程序得到的result.encryptedData與result.iv與后端得到的session_key 解密出我們得到的敏感用戶信息了。

五、新版本自動升級實現(xiàn)
小程序啟動自動調(diào)用函數(shù)

onLaunch(){

this.autoUpdate()

}

// 自動升級

autoUpdate() {

let self = this

// 獲取小程序更新機(jī)制兼容

if (!wx.canIUse('getUpdateManager')) {

 // 微信版本低

 // 如果希望用戶在最新版本的客戶端上體驗?zāi)男〕绦?,可以這樣子提示

 wx.showModal({

   title: '提示',

   content:

     '當(dāng)前微信版本過低,無法使用該功能,請升級到最新微信版本后重試。'

 })

 return

}

if (wx.canIUse('getUpdateManager')) {

 // 微信版本正常

 console.log(new Date())

 // 創(chuàng)建版本對象

 const updateManager = wx.getUpdateManager()

 // 1. 檢查小程序是否有新版本發(fā)布

 updateManager.onCheckForUpdate(res => {

   console.log(res, '檢測版本') // res.hasUpdate=false,代表沒有新版本

?

   if (res.hasUpdate) {

     // 2. 小程序有新版本,則靜默下載新版本,做好更新準(zhǔn)備 監(jiān)聽小程序有版本更新事件??蛻舳酥鲃佑|發(fā)下載(無需開發(fā)者觸發(fā))

     updateManager.onUpdateReady(async res => {

       console.log(new Date())

       wx.showModal({

         title: '更新提示',

         content: '新版本已經(jīng)準(zhǔn)備好,是否重啟應(yīng)用?',

         success(res) {

           if (res.confirm) {

             console.log('用戶同意下載更新')

             // 3. 新的版本已經(jīng)下載好,調(diào)用 applyUpdate 應(yīng)用新版本并重啟

             updateManager.applyUpdate()

           } else if (res.cancel) {

             console.log('用戶點(diǎn)擊取消')

             // 如果需要強(qiáng)制更新,則給出二次彈窗,如果不需要,則這里的代碼都可以刪掉了

             wx.showModal({

               title: '溫馨提示~',

               content:

                 '本次版本更新涉及到新的功能添加,舊版本無法正常訪問的哦~',

               success() {

                 console.log('再次彈框更新')

                 // 再次執(zhí)行更新檢測

                 self.autoUpdate()

                 // return

                 // 第二次提示后,強(qiáng)制更新

                 // if (res.confirm) {

                 //   // 新的版本已經(jīng)下載好,調(diào)用 applyUpdate 應(yīng)用新版本并重啟

                 //   updateManager.applyUpdate()

                 // } else if (res.cancel) {

                 //   //重新回到版本更新提示

                 //   self.autoUpdate()

                 // }

               }

             })

           }

         }

       })

     })

   }

 })

}

}

六、小程序擴(kuò)展
1、小程序使用lottie
https://blog.csdn.net/Xiao_peng117/article/details/102693084

https://developers.weixin.qq.com/miniprogram/dev/extended/utils/lottie.html

1、小程序使用three.js
https://www.it610.com/article/1280190449574756352.htm

https://blog.csdn.net/WeiHan_Seven/article/details/104511234

https://developers.weixin.qq.com/miniprogram/dev/extended/utils/threejs.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容