本篇文章主要介紹了微信小程序之頁面攔截器的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
場景
小程序有52個頁面,其中13個頁面無需任何身份,另外39個頁面需要系統(tǒng)角色。對于這39個頁面,如果微信用戶沒有系統(tǒng)角色,則跳轉(zhuǎn)到登錄頁。
是否有系統(tǒng)角色信息需要通過異步請求來獲取。
需求分析&實現(xiàn)
對需求進行抽象,其實要的就是一個過濾器,對小程序頁面的訪問進行過濾,符合條件的通過,不符合條件進行其他處理。
使用過php的laravel框架的童鞋,肯定一下子就聯(lián)想到了laravel框架的http中間件:
HTTP 中間件提供一個方便的機制來過濾進入應(yīng)用程序的 HTTP 請求,例如,Laravel 默認包含了一個中間件來檢驗用戶身份驗證,如果用戶沒有經(jīng)過身份驗證,中間件會將用戶導(dǎo)向登錄頁面,然而,如果用戶通過身份驗證,中間件將會允許這個請求進一步繼續(xù)前進。當然,除了身份驗證之外,中間件也可以被用來執(zhí)行各式各樣的任務(wù),CORS 中間件負責替所有即將離開程序的響應(yīng)加入適當?shù)捻憫?yīng)頭,一個日志中間件可以記錄所有傳入應(yīng)用程序的請求。
令人憂桑的是,微信小程序并沒有提供針對Page實例的中間件機制。所以只能從Page實例的生命周期處下手。
對于onLoad,一個頁面只會調(diào)用一次;對于onShow,每次打開頁面(比如小程序從后臺轉(zhuǎn)到前臺)都會調(diào)用一次。
在onLoad或者onShow鉤子函數(shù)里,對用戶身份進行校驗,通過后則拉取該頁面需要的數(shù)據(jù),否則跳轉(zhuǎn)到登錄頁。
//orderDetail.js onShow: function () { let that = this; //身份校驗 service.identityCheck(() => { //跳轉(zhuǎn)到登錄頁 wx.redirectTo({ url: "/pages/common/login/login" }); }, () => { //獲取頁面數(shù)據(jù)等等 that.getDetail(this.orderId); ... } ); },
不過,每個頁面都要這樣寫,重復(fù)代碼好多啊,侵入性也強。不如用裝飾函數(shù)(高大上的說法是裝飾者模式)來包裝一下:
//filter.js function identityFilter(pageObj){ if(pageObj.onShow){ let _onShow = pageObj.onShow; pageObj.onShow = function(){ service.identityCheck(()=>{ //跳轉(zhuǎn)到登錄頁 wx.redirectTo({ url: "/pages/common/login/login" }); },()=>{ //獲取頁面實例,防止this劫持 let currentInstance = getPageInstance(); _onShow.call(currentInstance); }); } } return pageObj; } function getPageInstance(){ var pages = getCurrentPages(); return pages[pages.length - 1]; } exports.identityFilter = identityFilter;
filter.js
用以提供過濾器方法,除了現(xiàn)有的用戶身份攔截,后續(xù)如果需要其他攔截,可以在這個文件增加。然后,在需要用戶身份攔截的小程序頁面代碼里,用filter.identityFilter
處理一下就可以了:
//orderDetail.js let filter = require('filter.js'); Page(filter.identityFilter({ ... onShow: function () { //獲取頁面數(shù)據(jù)等等 this.getDetail(this.orderId); //... }, ... }));
使用Promise進行優(yōu)化
上面的實現(xiàn)中,每次訪問頁面,都會執(zhí)行一次獲取用戶身份的方法(就是上面代碼里的service. identityCheck )。其實沒有必要,在小程序啟動的時候獲取一次就行了。也就是說,放在app.js的onLaunch方法里執(zhí)行。
每個小程序頁面實例化時,一般也會執(zhí)行異步方法,用來獲取頁面需要的數(shù)據(jù)。關(guān)鍵在于,我們需要保證,頁面的異步方法 必須在 獲取用戶身份的異步請求 之后執(zhí)行。
毋容置疑,Promise最擅長處理異步請求的執(zhí)行順序了。主子,快放代碼粗來:
//app.js App({ onLaunch:function(){ let p = new Promise(function(resolve,reject){ service.identityCheck(resolve,reject); }); this.globalData.promise = p; }, ... globalData: { promise:null, } });
//filter.js const appData = getApp().globalData; function identityFilter(pageObj){ if(pageObj.onShow){ let _onShow = pageObj.onShow; pageObj.onShow = function(){ //改動點 appData.promise.then(()=>{ //跳轉(zhuǎn)到登錄頁 wx.redirectTo({ url: "/pages/common/login/login" }); },()=>{ //獲取頁面實例,防止this劫持 let currentInstance = getPageInstance(); _onShow.call(currentInstance); }); } } return pageObj; }
小結(jié)
基本實現(xiàn)了小程序頁面的用戶身份攔截器,但是比起laravel的http中間件還是遜色一些:
需要對每個頁面代碼包裝一層。
即使用戶身份校驗不通過,小程序也并不會阻塞頁面的渲染。假如獲取用戶身份的異步方法一分鐘才執(zhí)行完,小程序頁面還是會展示出來,一分鐘之后才跳轉(zhuǎn)到登錄頁。需要自己增加邏輯,比如在這一分鐘內(nèi),頁面展示空白內(nèi)容。
以上是微信小程序開發(fā)頁面攔截器的詳解的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機

Video Face Swap
使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

Windows操作系統(tǒng)是全球最流行的操作系統(tǒng)之一,其新版本W(wǎng)in11備受矚目。在Win11系統(tǒng)中,管理員權(quán)限的獲取是一個重要的操作,管理員權(quán)限可以讓用戶對系統(tǒng)進行更多的操作和設(shè)置。本文將詳細介紹在Win11系統(tǒng)中如何獲取管理員權(quán)限,以及如何有效地管理權(quán)限。在Win11系統(tǒng)中,管理員權(quán)限分為本地管理員和域管理員兩種。本地管理員是指具有對本地計算機的完全管理權(quán)限

C++中的眾數(shù)函數(shù)詳解在統(tǒng)計學(xué)中,眾數(shù)指的是一組數(shù)據(jù)中出現(xiàn)次數(shù)最多的數(shù)值。在C++語言中,我們可以通過編寫一個眾數(shù)函數(shù)來找到任意一組數(shù)據(jù)中的眾數(shù)。眾數(shù)函數(shù)的實現(xiàn)可以采用多種不同的方法,下面將詳細介紹其中兩種常用的方法。第一種方法是使用哈希表來統(tǒng)計每個數(shù)字出現(xiàn)的次數(shù)。首先,我們需要定義一個哈希表,將每個數(shù)字作為鍵,出現(xiàn)次數(shù)作為值。然后,對于給定的數(shù)據(jù)集,我們遍

實現(xiàn)微信小程序中的卡片翻轉(zhuǎn)特效在微信小程序中,實現(xiàn)卡片翻轉(zhuǎn)特效是一種常見的動畫效果,可以提升用戶體驗和界面交互的吸引力。下面將具體介紹如何在微信小程序中實現(xiàn)卡片翻轉(zhuǎn)的特效,并提供相關(guān)代碼示例。首先,需要在小程序的頁面布局文件中定義兩個卡片元素,一個用于顯示正面內(nèi)容,一個用于顯示背面內(nèi)容,具體示例代碼如下:<!--index.wxml-->&l

OracleSQL中的除法運算詳解在OracleSQL中,除法運算是一種常見且重要的數(shù)學(xué)運算操作,用于計算兩個數(shù)相除的結(jié)果。除法在數(shù)據(jù)庫查詢中經(jīng)常用到,因此了解OracleSQL中的除法運算及其用法是數(shù)據(jù)庫開發(fā)人員必備的技能之一。本文將詳細討論OracleSQL中除法運算的相關(guān)知識,并提供具體的代碼示例供讀者參考。一、OracleSQL中的除法運算

C++中的取余函數(shù)詳解在C++中,取余運算符(%)用于計算兩個數(shù)相除的余數(shù)。它是一種二元運算符,其操作數(shù)可以是任何整數(shù)類型(包括char、short、int、long等),也可以是浮點數(shù)類型(如float、double)。取余運算符返回的結(jié)果與被除數(shù)的符號相同。例如,對于整數(shù)的取余運算,我們可以使用以下代碼來實現(xiàn):inta=10;intb=3;

Numpy是一款Python科學(xué)計算庫,提供了豐富的數(shù)組操作函數(shù)和工具。升級Numpy版本時需要查詢當前版本以保證兼容性,本文將詳細介紹Numpy版本查詢的方法,并提供具體的代碼示例。方法一:使用Python代碼查詢Numpy版本使用Python代碼可以輕松查詢Numpy的版本,以下是實現(xiàn)方法和示例代碼:importnumpyasnpprint(np

PHP中的模運算符(%)是用來獲取兩個數(shù)值相除的余數(shù)的。在本文中,我們將詳細討論模運算符的作用及用法,并提供具體的代碼示例來幫助讀者更好地理解。1.模運算符的作用在數(shù)學(xué)中,當我們將一個整數(shù)除以另一個整數(shù)時,會得到一個商和一個余數(shù)。例如,當我們將10除以3時,商為3,余數(shù)為1。模運算符就是用來獲取這個余數(shù)的。2.模運算符的用法在PHP中,使用%符號來表示模

Linux系統(tǒng)調(diào)用system()函數(shù)詳解系統(tǒng)調(diào)用是Linux操作系統(tǒng)中非常重要的一部分,它提供了一種與系統(tǒng)內(nèi)核進行交互的方式。其中,system()函數(shù)是一個常用的系統(tǒng)調(diào)用函數(shù)之一。本文將詳細介紹system()函數(shù)的使用方法,并提供相應(yīng)的代碼示例。系統(tǒng)調(diào)用的基本概念系統(tǒng)調(diào)用是用戶程序與操作系統(tǒng)內(nèi)核交互的一種方式。用戶程序通過調(diào)用系統(tǒng)調(diào)用函數(shù)來請求操作系統(tǒng)
