小程序如何做全局重新加載

背景:

隨著業(yè)務(wù)的增加,我們服務(wù)器需要計(jì)算大量的用戶數(shù)據(jù)孝宗,導(dǎo)致用戶跟客服反應(yīng)頁(yè)面不能正常展示穷躁。反饋給開(kāi)發(fā)后,我們一看因妇,是服務(wù)器異常的錯(cuò)誤问潭。So,產(chǎn)品想看下我們到底有多少用戶頁(yè)面不能正常展示婚被?

方案:

  1. 后端人員直接在阿里云后臺(tái)去查哪些接口異常
  2. 前端做一個(gè)服務(wù)器報(bào)錯(cuò)頁(yè)睦授,這樣產(chǎn)品在小程序后臺(tái)能看到這個(gè)頁(yè)面的PV,UV

技術(shù)方案

因?yàn)闃I(yè)務(wù)龐大,所以我們不可能區(qū)在每個(gè)頁(yè)面加上重新加載的邏輯摔寨。所以初步考慮使用全局重新加載去枷。

需要解決的問(wèn)題都有哪些?

  1. 首先我們要有網(wǎng)絡(luò)請(qǐng)求失敗的全局控制權(quán)(要不然就需要在每個(gè)頁(yè)面處理失敗的情況)
  2. 需要定義好網(wǎng)絡(luò)失敗后是如何跳轉(zhuǎn)到重載頁(yè)(R)的(用wx.redirectTo是复,wx.reLaunch還是其他)
  3. 點(diǎn)擊錯(cuò)誤頁(yè)的“重新加載”删顶,如何返回或跳轉(zhuǎn)到出錯(cuò)頁(yè)(E)(用wx.redirectTo,wx.reLaunch還是其他)
  4. 跳轉(zhuǎn)到出錯(cuò)頁(yè)后淑廊,如何重新加載數(shù)據(jù)(把所有請(qǐng)求都放在Page.onShow()里面?)
  5. 那如果從出錯(cuò)頁(yè)的上個(gè)界面(P)傳到出錯(cuò)頁(yè)(E)options逗余,那重載頁(yè)(R)又將如何處理?
  6. 點(diǎn)擊重新加載跟返回季惩,我們希望效果效果一樣录粱,又該如何操作?

實(shí)踐的方式如下

第一個(gè)問(wèn)題: 比較好解決画拾,我們基于wx.request已經(jīng)封裝了為fetch(如果還在用wx.request的項(xiàng)目可以考慮封裝下啥繁,好處多多)∏嗯祝基于fetch我們可以用res.statusCode來(lái)判斷服務(wù)器是否出錯(cuò)旗闽。

第二個(gè)問(wèn)題: 暫且先不說(shuō)具體的跳轉(zhuǎn)方式是怎樣的,就跳轉(zhuǎn)的url這個(gè)怎么定義也需要我們來(lái)討論下蜜另。為什么這么說(shuō)适室,因?yàn)槲覀兊募軜?gòu)涉及到了分包。分包加載意味著我們的代碼不僅僅是在pages下面举瑰,還放在了package下捣辆。

基于此,我們?cè)谔D(zhuǎn)的時(shí)候此迅,url能直接寫(xiě)成'../serverError/serverError'嗎汽畴?在主包下面可以正常跳轉(zhuǎn)促煮,但是在分包下,路徑是'package/serverError/serverError'整袁,這樣跳肯定不行菠齿。url應(yīng)該是根目錄下的路徑,所以'/pages/serverError/serverError'坐昙。

路徑確認(rèn)后绳匀,我們可以跳轉(zhuǎn)了。如果是wx.redirectTo(關(guān)閉當(dāng)前頁(yè)面炸客,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面)疾棵,想象下關(guān)閉E跳轉(zhuǎn)到R,點(diǎn)擊重新加載痹仙,再關(guān)閉R跳轉(zhuǎn)到E是尔,這么跳轉(zhuǎn)路徑復(fù)雜,用戶體驗(yàn)不好开仰,并且options的參數(shù)需要逐級(jí)傳遞拟枚。wx.reLaunch類(lèi)似。我們用所以我們選擇wx.navigateTo众弓。

第三個(gè)問(wèn)題: 綜合問(wèn)題二的解釋?zhuān)氐紼恩溅,我們用wx.navigateBack。

第四個(gè)問(wèn)題: 如果從R用wx.navigateBack回到E的話谓娃,肯定會(huì)觸發(fā)E.onShow()方法脚乡。但是有些請(qǐng)求我們除了寫(xiě)在Page.onShow()里,還有些是寫(xiě)在Page.onLoad()里的滨达,所以我們必須想辦法調(diào)起E.onLoad()奶稠。

大家對(duì)于getCurrentPages()這個(gè)方法肯定不陌生,官方定義是來(lái)獲取當(dāng)前頁(yè)面棧捡遍,我們一般用它來(lái)獲取當(dāng)前頁(yè)面路徑锌订。其實(shí)在這個(gè)過(guò)程中,我們是能拿到當(dāng)前頁(yè)面的實(shí)例的稽莉,并且實(shí)例里面有route(頁(yè)面路徑)options(頁(yè)面?zhèn)鬟f參數(shù))data(頁(yè)面初始參數(shù))以及各種function()等等瀑志。

利用previousPageClass()我們可以拿到E的實(shí)例,也就可以拿到E.options污秆,當(dāng)然我們也可以調(diào)E.onLoad()。

util.js

// 獲取當(dāng)前路徑
function currentPagePath() {
  let pageData = getCurrentPages()
  if (pageData.length >= 1) {
    let len = pageData.length - 1
    let data = pageData[len]
    return data.route
  } else {
    return ''
  }
}

// 獲取上個(gè)界面的實(shí)例
function previousPageClass() {
  let pageData = getCurrentPages()
  if (pageData.length >= 2) {
    let len = pageData.length - 2
    let preClass = pageData[len]
    return preClass
  } else {
    return ''
  }
}

module.exports = {
  currentPagePath,
  previousPageClass
}

第五個(gè)問(wèn)題: 基于問(wèn)題的四的方案昧甘,我們可以調(diào)E.onLoad(E.options)來(lái)將我們的參數(shù)回傳回去良拼。

第六個(gè)問(wèn)題: 點(diǎn)擊返回,相當(dāng)于頁(yè)面卸載充边,也就是執(zhí)行了R.onUnload(),這個(gè)時(shí)候我們只需要執(zhí)行E.onLoad(E.options)這個(gè)方法庸推,把options傳過(guò)去常侦,以及調(diào)用起E.onLoad()就OK了。

但是點(diǎn)擊重新加載贬媒,我們是調(diào)的wx.navigateBack()聋亡,這個(gè)方法也會(huì)走R.onUnload()。這是時(shí)候可能有些苦惱了际乘,我們隱藏掉返回按鈕坡倔?發(fā)現(xiàn)官方并沒(méi)有提供此方法。禁用R.onUnload()脖含,好像也不行罪塔。因?yàn)镽.onUnload()是在點(diǎn)擊重新加載后才執(zhí)行的,所以我們可以記錄下用戶是否點(diǎn)擊了重新加載的行為养葵。然后我們通過(guò)記錄的行為征堪,即便用戶點(diǎn)擊了重新加載,然后觸發(fā)了R.onUnload()关拒,我們不去執(zhí)行E.onLoad(E.options)就OK了佃蚜。

// pages/serverError/serverError.js

import { previousPageClass } from '../../utils/util.js'

let isClickReload = false

Page({

  onLoad: function (options) {
    isClickReload = false
  },
  onUnload: function () {
    if(!isClickReload) {
      this.callbackParams()
    }    
  },
  /**
   * 點(diǎn)擊事件
   */
  clickReload: function (e) {
    isClickReload = true
    wx.navigateBack()
    this.callbackParams()
  },
  // 點(diǎn)擊返回,參數(shù)回傳
  callbackParams: function () {
    let preOptions = previousPageClass().options
    previousPageClass().onLoad(preOptions)
  }
})

至此所有問(wèn)題着绊,基本都已解決爽锥。
Demo代碼附上,歡迎參考畔柔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氯夷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子靶擦,更是在濱河造成了極大的恐慌腮考,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玄捕,死亡現(xiàn)場(chǎng)離奇詭異踩蔚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)枚粘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)馅闽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人馍迄,你說(shuō)我怎么就攤上這事福也。” “怎么了攀圈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵暴凑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赘来,道長(zhǎng)现喳,這世上最難降的妖魔是什么凯傲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮嗦篱,結(jié)果婚禮上冰单,老公的妹妹穿的比我還像新娘。我一直安慰自己灸促,他們只是感情好诫欠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著腿宰,像睡著了一般呕诉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吃度,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天甩挫,我揣著相機(jī)與錄音,去河邊找鬼椿每。 笑死伊者,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的间护。 我是一名探鬼主播亦渗,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汁尺!你這毒婦竟也來(lái)了法精?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痴突,失蹤者是張志新(化名)和其女友劉穎搂蜓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辽装,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帮碰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拾积。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殉挽。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拓巧,靈堂內(nèi)的尸體忽然破棺而出斯碌,到底是詐尸還是另有隱情,我是刑警寧澤玲销,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布输拇,位于F島的核電站,受9級(jí)特大地震影響贤斜,放射性物質(zhì)發(fā)生泄漏策吠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一瘩绒、第九天 我趴在偏房一處隱蔽的房頂上張望猴抹。 院中可真熱鬧,春花似錦锁荔、人聲如沸蟀给。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跋理。三九已至,卻和暖如春恬总,著一層夾襖步出監(jiān)牢的瞬間前普,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工壹堰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拭卿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓贱纠,卻偏偏與公主長(zhǎng)得像峻厚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谆焊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容