亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

微信小程序之頁面攔截器的示例代碼

 更新時間:2017年09月07日 09:03:59   作者:marginyu  
本篇文章主要介紹了微信小程序之頁面攔截器的示例代碼,小編覺得挺不錯的,現(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ù)前進。當(dāng)然,除了身份驗證之外,中間件也可以被用來執(zhí)行各式各樣的任務(wù),CORS 中間件負責(zé)替所有即將離開程序的響應(yīng)加入適當(dā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)容。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • js判斷ie版本號的簡單實現(xiàn)代碼

    js判斷ie版本號的簡單實現(xiàn)代碼

    本篇文章主要是對js判斷ie版本號的簡單實現(xiàn)代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-03-03
  • IE、FF瀏覽器下修改標(biāo)簽透明度

    IE、FF瀏覽器下修改標(biāo)簽透明度

    通過js修改標(biāo)簽透明度,兼容IE、FF瀏覽器,需要的朋友可以參考下
    2014-01-01
  • JavaScript錯誤處理之分析 Uncaught(in promise) error的原因及解決方案

    JavaScript錯誤處理之分析 Uncaught(in promise) error的

    在開發(fā)過程中,JavaScript的錯誤處理是一個老生常談的話題,當(dāng)應(yīng)用程序發(fā)生未捕獲的異常時,Uncaught(in promise) error是其中最常見的錯誤類型,這篇文章將從多個方面詳細闡述這種錯誤類型的原因與解決方案,感興趣的朋友一起看看吧
    2023-12-12
  • 側(cè)欄跟隨滾動的簡單實現(xiàn)代碼

    側(cè)欄跟隨滾動的簡單實現(xiàn)代碼

    側(cè)欄里的有些內(nèi)容滾動到頁面頂端以后就固定在那個位置,不再跟隨滾動條而滾動,想必很多站長朋友都想實現(xiàn)這個效果吧,接下來為大家詳細介紹下,感興趣的你可不要錯過了哈
    2013-03-03
  • js仿淘寶商品放大預(yù)覽功能

    js仿淘寶商品放大預(yù)覽功能

    本文主要介紹了js仿淘寶商品放大預(yù)覽功能的實例。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • JavaScript簡單驗證表單空值及郵箱格式的方法

    JavaScript簡單驗證表單空值及郵箱格式的方法

    這篇文章主要介紹了JavaScript簡單驗證表單空值及郵箱格式的方法,涉及javascript基本的表單與字符串操作相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2017-01-01
  • ES6 迭代器與可迭代對象的實現(xiàn)

    ES6 迭代器與可迭代對象的實現(xiàn)

    這篇文章主要介紹了ES6 迭代器與可迭代對象的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • JS簡單實現(xiàn)表格排序功能示例

    JS簡單實現(xiàn)表格排序功能示例

    這篇文章主要介紹了JS簡單實現(xiàn)表格排序功能,涉及javascript針對頁面元素的遍歷、判斷與排序相關(guān)操作技巧,需要的朋友可以參考下
    2016-12-12
  • 網(wǎng)易JS面試題與Javascript詞法作用域說明

    網(wǎng)易JS面試題與Javascript詞法作用域說明

    Javascript函數(shù)在定義它們的作用域里運行,而不是在執(zhí)行它們的作用域里運行。
    2010-11-11
  • 如何用CocosCreator實現(xiàn)射擊小游戲

    如何用CocosCreator實現(xiàn)射擊小游戲

    這篇文章主要介紹了如何用CocosCreator實現(xiàn)射擊小游戲,此游戲難度不大,僅作為入門的練手小游戲,一小時就能完成,里面用到的知識很常用,喜歡游戲的同學(xué),可以參考下
    2021-04-04

最新評論