国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程序 小程序開發(fā) 微信小程序開發(fā)頁面攔截器的詳解

微信小程序開發(fā)頁面攔截器的詳解

May 29, 2018 am 09:51 AM
小程序 程序開發(fā) 詳解

本篇文章主要介紹了微信小程序之頁面攔截器的示例代碼,小編覺得挺不錯的,現(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)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應(yīng)法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

Win11管理員權(quán)限獲取詳解 Win11管理員權(quán)限獲取詳解 Mar 08, 2024 pm 03:06 PM

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ù)詳解 C++中的眾數(shù)函數(shù)詳解 Nov 18, 2023 pm 03:08 PM

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)特效 Nov 21, 2023 am 10:55 AM

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

Oracle SQL中的除法運算詳解 Oracle SQL中的除法運算詳解 Mar 10, 2024 am 09:51 AM

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

C++中的取余函數(shù)詳解 C++中的取余函數(shù)詳解 Nov 18, 2023 pm 02:41 PM

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

numpy版本查詢方法詳解 numpy版本查詢方法詳解 Jan 19, 2024 am 08:20 AM

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

PHP模運算符的作用及用法詳解 PHP模運算符的作用及用法詳解 Mar 19, 2024 pm 04:33 PM

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

linux系統(tǒng)調(diào)用system()函數(shù)詳解 linux系統(tǒng)調(diào)用system()函數(shù)詳解 Feb 22, 2024 pm 08:21 PM

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)

See all articles