微信小程序開發頁面攔截器的詳解

    本篇文章主要介紹了微信小程序之頁面攔截器的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。愛掏網 - it200.com一起跟隨小編過來看看吧

    場景

    • 小程序有52個頁面,其中13個頁面無需任何身份,另外39個頁面需要系統角色。愛掏網 - it200.com對于這39個頁面,如果微信用戶沒有系統角色,則跳轉到登錄頁。愛掏網 - it200.com

    • 是否有系統角色信息需要通過異步請求來獲取。愛掏網 - it200.com

    需求分析&實現

    對需求進行抽象,其實要的就是一個過濾器,對小程序頁面的訪問進行過濾,符合條件的通過,不符合條件進行其他處理。愛掏網 - it200.com

    使用過php的laravel框架的童鞋,肯定一下子就聯想到了laravel框架的http中間件:

    HTTP 中間件提供一個方便的機制來過濾進入應用程序的 HTTP 請求,例如,Laravel 默認包含了一個中間件來檢驗用戶身份驗證,如果用戶沒有經過身份驗證,中間件會將用戶導向登錄頁面,然而,如果用戶通過身份驗證,中間件將會允許這個請求進一步繼續前進。愛掏網 - it200.com當然,除了身份驗證之外,中間件也可以被用來執行各式各樣的任務,CORS 中間件負責替所有即將離開程序的響應加入適當的響應頭,一個日志中間件可以記錄所有傳入應用程序的請求。愛掏網 - it200.com

    令人憂桑的是,微信小程序并沒有提供針對Page實例的中間件機制。愛掏網 - it200.com所以只能從Page實例的生命周期處下手。愛掏網 - it200.com

    對于onLoad,一個頁面只會調用一次;對于onShow,每次打開頁面(比如小程序從后臺轉到前臺)都會調用一次。愛掏網 - it200.com

    在onLoad或者onShow鉤子函數里,對用戶身份進行校驗,通過后則拉取該頁面需要的數據,否則跳轉到登錄頁。愛掏網 - it200.com

    //orderDetail.js
    onShow: function () {
      let that = this;
      //身份校驗
      service.identityCheck(() => {
         //跳轉到登錄頁
         wx.redirectTo({
          url: "/pages/common/login/login"
         });
        }, () => {  
         //獲取頁面數據等等   
         that.getDetail(this.orderId);
         ...
        }
      );
     },
    登錄后復制

    不過,每個頁面都要這樣寫,重復代碼好多啊,侵入性也強。愛掏網 - it200.com不如用裝飾函數(高大上的說法是裝飾者模式)來包裝一下:

    //filter.js
    function identityFilter(pageObj){
      if(pageObj.onShow){
        let _onShow = pageObj.onShow;
        pageObj.onShow = function(){
          service.identityCheck(()=>{
            //跳轉到登錄頁
            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用以提供過濾器方法,除了現有的用戶身份攔截,后續如果需要其他攔截,可以在這個文件增加。愛掏網 - it200.com然后,在需要用戶身份攔截的小程序頁面代碼里,用filter.identityFilter處理一下就可以了:

    //orderDetail.js
    let filter = require('filter.js');
    Page(filter.identityFilter({
      ...
      onShow: function () {
        //獲取頁面數據等等
        this.getDetail(this.orderId);
        //...
      },
      ...
    }));
    登錄后復制

    使用Promise進行優化

    上面的實現中,每次訪問頁面,都會執行一次獲取用戶身份的方法(就是上面代碼里的service. identityCheck )。愛掏網 - it200.com其實沒有必要,在小程序啟動的時候獲取一次就行了。愛掏網 - it200.com也就是說,放在app.js的onLaunch方法里執行。愛掏網 - it200.com

    每個小程序頁面實例化時,一般也會執行異步方法,用來獲取頁面需要的數據。愛掏網 - it200.com關鍵在于,我們需要保證,頁面的異步方法 必須在 獲取用戶身份的異步請求 之后執行。愛掏網 - it200.com

    毋容置疑,Promise最擅長處理異步請求的執行順序了。愛掏網 - it200.com主子,快放代碼粗來:

    //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(()=>{
            //跳轉到登錄頁
            wx.redirectTo({
              url: "/pages/common/login/login"
            });
          },()=>{
            //獲取頁面實例,防止this劫持
            let currentInstance = getPageInstance();
            _onShow.call(currentInstance);
          });
        }
      }
      return pageObj;
    }
    登錄后復制

    小結

    基本實現了小程序頁面的用戶身份攔截器,但是比起laravel的http中間件還是遜色一些:

    • 需要對每個頁面代碼包裝一層。愛掏網 - it200.com

    • 即使用戶身份校驗不通過,小程序也并不會阻塞頁面的渲染。愛掏網 - it200.com假如獲取用戶身份的異步方法一分鐘才執行完,小程序頁面還是會展示出來,一分鐘之后才跳轉到登錄頁。愛掏網 - it200.com需要自己增加邏輯,比如在這一分鐘內,頁面展示空白內容。愛掏網 - it200.com

    以上就是微信小程序開發頁面攔截器的詳解的詳細內容,更多請關注愛掏網 - it200.com其它相關文章!

    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 国产精品一区二区在线观看| 国产成人一区二区在线不卡| 精品一区二区三区四区电影| 国产精品va无码一区二区| 麻豆国产在线不卡一区二区| 在线播放偷拍一区精品| 国产AV午夜精品一区二区三区| 无码日韩精品一区二区人妻| 日本一区二区三区在线观看视频| 精品乱码一区二区三区四区| 国产精品美女一区二区视频| 中文字幕在线无码一区二区三区| 国产一区二区三区露脸| 日本精品3d动漫一区二区| 亚洲av色香蕉一区二区三区| 伊人久久精品一区二区三区| 91福利一区二区| 亚洲综合av一区二区三区不卡| 日本内射精品一区二区视频| 99久久精品国产一区二区成人 | 国产成人一区二区三区免费视频| 亚洲一区二区影视| 亚洲一区二区三区四区视频| 亚洲综合一区二区精品久久| 精品无码人妻一区二区三区品| 亚洲国产精品第一区二区| 精品三级AV无码一区| 成人中文字幕一区二区三区| 人妻在线无码一区二区三区| 亚洲欧洲专线一区| 国产成人精品一区二三区| 亚洲美女高清一区二区三区| 精品一区二区三区在线视频观看| aⅴ一区二区三区无卡无码| 在线观看国产一区| 亚洲Av高清一区二区三区| 国产裸体舞一区二区三区| 一区二区三区四区无限乱码| 中文人妻无码一区二区三区| 一区二区三区亚洲| 国产成人精品一区二区A片带套|