微信小程序跳轉傳參參數丟失?


垂死病中驚坐起,笑問 Bug 何處來?!

1、先是大寫字母作祟

前兩天發布了「柒留言」v2.0.0 新版本,結果...你懂的嘛,沒有 Bug 的程序不是好程序,寫不出 Bug 的程序員不是好程序員。

那個,有一兩個小 Bug 很正常的啦。

有用戶反饋,收到了留言回復的通知,但是點進去沒有內容。怎么會有 Bug 呢?肯定是你用的方法不對。

下班回到家的我立馬打開開發者工具,一測試發現,果然,我是不可能寫不出 Bug 的。

寫 Bug 是一把好手,找 Bug 我也是不賴的,最后原因定位:參數沒有正確傳遞。

 

A 頁面
// a.wxml
<view data-testID="test" data-openid="msunh" bindtap="toB">B</view>

// a.js
toB(e) {
  var i = e.currentTarget.dataset;
  wx.navigateTo({
    url: '/pages/b?testID=' + i.testID + '&openid=' + i.openid,
  })
  console.log(i)
}
B 頁面
// b.js
onLoad: function (options) {
  this.setData({
    testID: options.testID,
    openid: options.openid
  })
}

結果是:

很明顯,openid 獲得了正確參數,說明接收和傳遞過程毛問題,那就是傳遞之前 testID 就出錯了。

控制台打印一下 dataset,發現沒有, testID 變成了 testid。

這說明了什么?說明他在搞事情,他在搞我!這里把 testID 改成 testid,就能正確傳遞了。

數據綁定不能用大寫,記住啊,兄die。(或者可以用大寫綁定,小寫獲取,開心就好呀)

2、連一個 ? 都敢搞我?

改完 Bug 想着可以休息會,結果大半夜又有人找:回復讀者失敗了。

我試了一下,沒發現他說的問題。便回復道:刷新一下?多試兩次?換個網絡?應該不是我這邊的問題吧...

過了一會,這個老哥說還是不行,然后這個老哥大半夜還和我一起來找 Bug 了,感動,找到 Bug 我還特地發了個紅包感謝。

最后發現數據在一個問號那里斷開了,前面數據正常,后面數據被截斷。仔細看下是因為用戶輸入了一個英文「?」??????

做個測試:

 

A 頁面
// a.wxml
<view data-hello="你最近怎么樣?我很好" bindtap="toB">toB</view>
// a.js
toB(e) {
  var i = e.currentTarget.dataset;
  wx.navigateTo({
    url: '/pages/b?hello=' + i.hello,
  })
}
B 頁面
// b.js
onLoad: function (options) {
  this.setData({
    hello: options.hello,
  })
}

結果 AppData 中是這樣的:

果然是英文問號惹的麻煩,腦殼疼,連個「?」都來找麻煩,我好南南南南南南啊。


3、盤他

找到問題了就盤他,但這不能怪用戶,鬼知道什么時候就輸入了一個「?」。因為跳轉路徑中加參數也是用的「?」,所以這里應該是被誤「?」后面帶參。

最后我想了兩種方法,這里供大家參考一下,如果有更好的方法,歡迎留言一起討論。

I. 跳轉頁面的時候把 dataset 的數據寫入緩存,到了新頁面再讀取緩存,這里就不啰嗦了,關鍵是第二種。

II. 利用 replace 把 ? 轉化成 ?

但是這里有個問題,用  replace('?', '?') 的話,只能轉化一次。

如果輸入了多個英文問號呢?不排除這種可能,所以不建議用  replace('?', '?') ,推薦加入正則表達式,即 replace(/\?/g, "?") 去轉化英文問號。

 

4、最后

柒塊腹肌的玖柒回來了,有段時間沒更新了,一直在忙着重寫小程序,主要是我還沒有想到更好的借口。

今年還有 101 天,我會努力爬上來更新的,點擊下方「寫留言」一起討論呀,分享、討論才是更好的學習方式,搖起來。

本文首發於公眾號「我是玖柒后」,一起來踩坑吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM