小程式如何做全域性重新載入
背景:
隨著業務的增加,我們伺服器需要計算大量的使用者資料,導致使用者跟客服反應頁面不能正常展示。反饋給開發後,我們一看,是伺服器異常的錯誤。So,產品想看下我們到底有多少使用者頁面不能正常展示?
方案:
後端人員直接在阿里雲後臺去查哪些介面異常
前端做一個伺服器報錯頁,這樣產品在小程式後臺能看到這個頁面的PV,UV
技術方案
因為業務龐大,所以我們不可能區在每個頁面加上重新載入的邏輯。所以初步考慮使用全域性重新載入。
需要解決的問題都有哪些?
首先我們要有網路請求失敗的全域性控制權(要不然就需要在每個頁面處理失敗的情況)
需要定義好網路失敗後是如何跳轉到過載頁(R)的(用wx.redirectTo,wx.reLaunch還是其他)
點選錯誤頁的“重新載入”,如何返回或跳轉到出錯頁(E)(用wx.redirectTo,wx.reLaunch還是其他)
跳轉到出錯頁後,如何重新載入資料(把所有請求都放在Page.onShow()裡面?)
那如果從出錯頁的上個介面(P)傳到出錯頁(E)options,那過載頁(R)又將如何處理?
點選重新載入跟返回,我們希望效果效果一樣,又該如何操作?
實踐的方式如下
第一個問題: 比較好解決,我們基於wx.request已經封裝了為fetch(如果還在用wx.request的專案可以考慮封裝下,好處多多)。基於fetch我們可以用res.statusCode來判斷伺服器是否出錯。
第二個問題: 暫且先不說具體的跳轉方式是怎樣的,就跳轉的url這個怎麼定義也需要我們來討論下。為什麼這麼說,因為我們的架構涉及到了分包。分包載入意味著我們的程式碼不僅僅是在pages下面,還放在了package下。
基於此,我們在跳轉的時候,url能直接寫成'../serverError/serverError'嗎?在主包下面可以正常跳轉,但是在分包下,路徑是'package/serverError/serverError',這樣跳肯定不行。url應該是根目錄下的路徑,所以'/pages/serverError/serverError'。
路徑確認後,我們可以跳轉了。如果是wx.redirectTo(關閉當前頁面,跳轉到應用內的某個頁面),想象下關閉E跳轉到R,點選重新載入,再關閉R跳轉到E,這麼跳轉路徑複雜,使用者體驗不好,並且options的引數需要逐級傳遞。wx.reLaunch類似。我們用所以我們選擇wx.navigateTo。
第三個問題: 綜合問題二的解釋,跳回到E,我們用wx.navigateBack。
第四個問題: 如果從R用wx.navigateBack回到E的話,肯定會觸發E.onShow()方法。但是有些請求我們除了寫在Page.onShow()裡,還有些是寫在Page.onLoad()裡的,所以我們必須想辦法調起E.onLoad()。
大家對於getCurrentPages()這個方法肯定不陌生,官方定義是來獲取當前頁面棧,我們一般用它來獲取當前頁面路徑。其實在這個過程中,我們是能拿到當前頁面的例項的,並且例項裡面有route(頁面路徑)options(頁面傳遞引數)data(頁面初始引數)以及各種function()等等。
利用previousPageClass()我們可以拿到E的例項,也就可以拿到E.options,當然我們也可以調E.onLoad()。
util.js// 獲取當前路徑function currentPagePath() { let pageData = getCurrentPages() if (pageData.length >= 1) { let len = pageData.length - 1 let data = pageData[len] return data.route } else { return '' } }// 獲取上個介面的例項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 }
第五個問題: 基於問題的四的方案,我們可以調E.onLoad(E.options)來將我們的引數回傳回去。
第六個問題: 點選返回,相當於頁面解除安裝,也就是執行了R.onUnload(),這個時候我們只需要執行E.onLoad(E.options)這個方法,把options傳過去,以及呼叫起E.onLoad()就OK了。
但是點選重新載入,我們是調的wx.navigateBack(),這個方法也會走R.onUnload()。這是時候可能有些苦惱了,我們隱藏掉返回按鈕?發現官方並沒有提供此方法。禁用R.onUnload(),好像也不行。因為R.onUnload()是在點選重新載入後才執行的,所以我們可以記錄下使用者是否點選了重新載入的行為。然後我們透過記錄的行為,即便使用者點選了重新載入,然後觸發了R.onUnload(),我們不去執行E.onLoad(E.options)就OK了。
// pages/serverError/serverError.jsimport { previousPageClass } from '../../utils/util.js'let isClickReload = falsePage({ onLoad: function (options) { isClickReload = false }, onUnload: function () { if(!isClickReload) { this.callbackParams() } }, /** * 點選事件 */ clickReload: function (e) { isClickReload = true wx.navigateBack() this.callbackParams() }, // 點選返回,引數回傳 callbackParams: function () { let preOptions = previousPageClass().options previousPageClass().onLoad(preOptions) } })
作者:Luciena
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2983/viewspace-2815082/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 小程式 分屏載入&下拉重新整理
- 小程式全域性狀態管理
- 微信小程式的全域性彈窗以及全域性例項微信小程式
- 微信小程式------全域性配置設定微信小程式
- 0179-載入全域性描述符表
- vue-element-admin 全域性loading載入等待Vue
- 微信小程式全域性狀態管理 wxscv微信小程式
- uni-app 微信小程式全域性分享APP微信小程式
- 微信小程式實現全域性搜尋程式碼高亮微信小程式
- 小程式分包載入
- 全域性負載均衡方案負載
- 直播系統程式碼,小程式全域性分享和頁面分享
- vue2.0全域性路由守衛(全域性控制登入)Vue路由
- Swift 全域性匯入ModuleSwift
- 【微信小程式】scroll-view 的上拉載入和下拉重新整理微信小程式View
- 微信小程式setData區域性重新整理列表微信小程式
- 小程式分屏載入實踐
- vue 中新增全域性輪詢訊息重新整理Vue
- 前端【小程式】04-小程式基礎篇【分包載入】前端
- 微信小程式分頁載入微信小程式
- 手摸手系列,100行程式碼搞定微信小程式全域性狀態同步行程微信小程式
- 微信小程式點贊、評論區域性重新整理微信小程式
- (精華)2020年7月9日 微信小程式 小程式生命週期和全域性變數微信小程式變數
- 你可以零侵入式實現小程式的全域性狀態管理嗎
- ECCV24|全域性式SfM最新SOTA,GLOMAP重新定義SfM!
- 小程式預載入資料實戰
- 轉載:cnpm全域性安裝(淘寶映象)NPM
- 微信小程式全域性狀態管理,並提供Vuex的開發體驗微信小程式Vue
- MySQL鎖(一)全域性鎖:如何做全庫的邏輯備份?MySql
- 全域性負載均衡與CDN內容分發負載
- vue定義全域性變數和全域性方法Vue變數
- 實時重新載入go應用Go
- .net core 登入全域性驗證過濾器過濾器
- 框架(frameset),全域性屬性框架
- 小程式頁面下拉重新整理
- 轉轉:微信小程式分包載入實戰微信小程式
- 小程式中使用ECharts 非同步載入資料Echarts非同步
- 全域性變數變數