小程序九九八十一坑之跳轉傳參

  • 2019 年 10 月 3 日
  • 筆記

垂死病中驚坐起,笑問 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 天,我會努力爬上來更新的,點擊下方「寫留言」一起討論呀,分享、討論才是更好的學習方式,搖起來。

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