這篇文章主要介紹了微信小程式之頁攔截器的範(fàn)例程式碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟著小編過來看看吧
場景
#小程式有52個頁面,其中13個頁面無需任何身份,另外39個頁面需要係統(tǒng)角色。對於這39個頁面,如果微信使用者沒有系統(tǒng)角色,則跳到登入頁。
是否有系統(tǒng)角色資訊需要透過非同步請求來取得。
需求分析&實作
對需求進(jìn)行抽象,其實要的就是一個過濾器,對小程式頁面的訪問進(jìn)行過濾,符合條件的通過,不符合條件進(jìn)行其他處理。
使用過php的laravel框架的童鞋,肯定一下子就聯(lián)想到了laravel框架的http中間件:
HTTP 中間件提供一個方便的機制來過濾進(jìn)入應(yīng)用程序的HTTP 請求,例如,Laravel 預(yù)設(shè)包含了一個中間件來檢驗用戶身份驗證,如果用戶沒有經(jīng)過身份驗證,中間件會將用戶導(dǎo)向登錄頁面,然而,如果用戶通過身份驗證,中間件將會允許這個請求進(jìn)一步繼續(xù)前進(jìn)。當(dāng)然,除了身份驗證之外,中間件也可以被用來執(zhí)行各式各樣的任務(wù),CORS 中間件負(fù)責(zé)替所有即將離開程序的響應(yīng)加入適當(dāng)?shù)捻憫?yīng)頭,一個日誌中間件可以記錄所有傳入應(yīng)用程序的請求。
令人憂桑的是,微信小程式並沒有提供針對Page實例的中間件機制。所以只能從Page實例的生命週期下手。
對於onLoad,一個頁面只會呼叫一次;對於onShow,每次開啟頁面(例如小程式從後臺轉(zhuǎn)到前臺)都會呼叫一次。
在onLoad或onShow鉤子函數(shù)裡,對使用者身分進(jìn)行校驗,透過後則拉取該頁面所需的數(shù)據(jù),否則跳到登入頁。
//orderDetail.js onShow: function () { let that = this; //身份校驗 service.identityCheck(() => { //跳轉(zhuǎn)到登錄頁 wx.redirectTo({ url: "/pages/common/login/login" }); }, () => { //獲取頁面數(shù)據(jù)等等 that.getDetail(this.orderId); ... } ); },
不過,每個頁面都要這樣寫,重複程式碼好多啊,侵入性也強。不如用裝飾函數(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ù)如果需要其他攔截,可以在這個檔案增加。然後,在需要使用者身分?jǐn)r截的小程式頁面程式碼裡,用filter.identityFilter
處理一下就可以了:
//orderDetail.js let filter = require('filter.js'); Page(filter.identityFilter({ ... onShow: function () { //獲取頁面數(shù)據(jù)等等 this.getDetail(this.orderId); //... }, ... }));
使用Promise進(jìn)行最佳化
#上面的實作中,每次造訪頁面,都會執(zhí)行一次取得使用者身分的方法(就是上面程式碼裡的service. identityCheck )。其實沒有必要,在小程式啟動的時候取得一次就行了。也就是說,放在app.js的onLaunch方法裡執(zhí)行。
每個小程式頁面實例化時,一般也會執(zhí)行非同步方法,用來取得頁面所需的資料。關(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é)
基本上實作了小程式頁面的使用者身分?jǐn)r截器,但是比起laravel的http中間件還是遜色一些:
需要對每個頁面程式碼包裝一層。
即使使用者身分校驗不通過,小程式也不會阻塞頁面的渲染。若要取得使用者身分的非同步方法一分鐘才執(zhí)行完,小程式頁面還是會展示出來,一分鐘之後才跳到登入頁。需要自己增加邏輯,例如在這一分鐘內(nèi),頁面展示空白內(nèi)容。
以上是微信小程式開發(fā)頁面攔截器的詳解的詳細(xì)內(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作業(yè)系統(tǒng)是全球最受歡迎的作業(yè)系統(tǒng)之一,其新版本W(wǎng)in11備受矚目。在Win11系統(tǒng)中,管理員權(quán)限的取得是一個重要的操作,管理員權(quán)限可以讓使用者對系統(tǒng)進(jìn)行更多的操作和設(shè)定。本文將詳細(xì)介紹在Win11系統(tǒng)中如何取得管理員權(quán)限,以及如何有效地管理權(quán)限。在Win11系統(tǒng)中,管理員權(quán)限分為本機管理員和網(wǎng)域管理員兩種。本機管理員是指具有對本機電腦的完全管理權(quán)限

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

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

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

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

Numpy是一款Python科學(xué)計算庫,提供了豐富的陣列操作函數(shù)與工具。升級Numpy版本時需要查詢目前版本以確保相容性,本文將詳細(xì)介紹Numpy版本查詢的方法,並提供具體的程式碼範(fàn)例。方法一:使用Python程式碼查詢Numpy版本使用Python程式碼可以輕鬆查詢Numpy的版本,以下是實作方法和範(fàn)例程式碼:importnumpyasnpprint(np

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

Linux系統(tǒng)呼叫system()函數(shù)詳解系統(tǒng)呼叫是Linux作業(yè)系統(tǒng)中非常重要的一部分,它提供了一種與系統(tǒng)核心互動的方式。其中,system()函數(shù)是常用的系統(tǒng)呼叫函數(shù)之一。本文將詳細(xì)介紹system()函數(shù)的使用方法,並提供對應(yīng)的程式碼範(fàn)例。系統(tǒng)呼叫的基本概念系統(tǒng)呼叫是使用者程式與作業(yè)系統(tǒng)核心互動的一種方式。使用者程式透過呼叫系統(tǒng)呼叫函數(shù)來請求作業(yè)系統(tǒng)
