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

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

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

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

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

禪工作室 13.0.1
強(qiáng)大的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)限的取得是一個(gè)重要的操作,管理員權(quán)限可以讓使用者對系統(tǒng)進(jìn)行更多的操作和設(shè)定。本文將詳細(xì)介紹在Win11系統(tǒng)中如何取得管理員權(quán)限,以及如何有效地管理權(quán)限。在Win11系統(tǒng)中,管理員權(quán)限分為本機(jī)管理員和網(wǎng)域管理員兩種。本機(jī)管理員是指具有對本機(jī)電腦的完全管理權(quán)限

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

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

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

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

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

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