国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網 責編:小采 時間:2020-11-27 22:30:58
文檔

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

微信小程序之頁面攔截器的示例代碼:場景 小程序有52個頁面,其中13個頁面無需任何身份,另外39個頁面需要系統角色。對于這39個頁面,如果微信用戶沒有系統角色,則跳轉到登錄頁。 是否有系統角色信息需要通過異步請求來獲取。 需求分析&實現 對需求進行抽象,其實要的就是一個過濾器,對小
推薦度:
導讀微信小程序之頁面攔截器的示例代碼:場景 小程序有52個頁面,其中13個頁面無需任何身份,另外39個頁面需要系統角色。對于這39個頁面,如果微信用戶沒有系統角色,則跳轉到登錄頁。 是否有系統角色信息需要通過異步請求來獲取。 需求分析&實現 對需求進行抽象,其實要的就是一個過濾器,對小

場景

  • 小程序有52個頁面,其中13個頁面無需任何身份,另外39個頁面需要系統角色。對于這39個頁面,如果微信用戶沒有系統角色,則跳轉到登錄頁。
  • 是否有系統角色信息需要通過異步請求來獲取。
  • 需求分析&實現

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

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

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

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

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

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

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

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

    //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用以提供過濾器方法,除了現有的用戶身份攔截,后續如果需要其他攔截,可以在這個文件增加。然后,在需要用戶身份攔截的小程序頁面代碼里,用filter.identityFilter處理一下就可以了:

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

    使用Promise進行優化

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

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

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

    //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中間件還是遜色一些:

  • 需要對每個頁面代碼包裝一層。
  • 即使用戶身份校驗不通過,小程序也并不會阻塞頁面的渲染。假如獲取用戶身份的異步方法一分鐘才執行完,小程序頁面還是會展示出來,一分鐘之后才跳轉到登錄頁。需要自己增加邏輯,比如在這一分鐘內,頁面展示空白內容。
  • 聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

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

    微信小程序之頁面攔截器的示例代碼:場景 小程序有52個頁面,其中13個頁面無需任何身份,另外39個頁面需要系統角色。對于這39個頁面,如果微信用戶沒有系統角色,則跳轉到登錄頁。 是否有系統角色信息需要通過異步請求來獲取。 需求分析&實現 對需求進行抽象,其實要的就是一個過濾器,對小
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 销魂美女一区二区 | 午夜视频免费观看 | 爽爽窝窝午夜精品一区二区 | 国产精品一区欧美日韩制服 | 欧美日韩另类国产 | 久久精品国产欧美日韩99热 | 日韩欧美一区二区三区在线播放 | 日韩一区二区三区四区不卡 | 国产在线播放一区二区 | 国产精品久久久久久久免费 | 久国产 | 久久91精品国产一区二区 | 国产丰满眼镜女在线观看 | 久久成人国产精品一区二区 | 日韩高清第一页 | 国产成人精品综合久久久 | 日韩在线视频在线观看 | 在线观看日韩精品 | 亚洲小色网 | 国产精品一区二区三区四区五区 | 国产精品免费看 | 在线视频观看国产 | 亚洲精品电影 | 日韩欧美视频一区 | 久久精品一级 | 成人一a毛片免费视频 | 国内精品一区二区三区最新 | 国产在线高清不卡免费播放 | 久久中文字幕久久久久91 | 日本三级韩国三级欧美三级 | 麻豆一区 | 国产精品久久久久久免费播放 | 亚洲精品免费观看 | 在线免费国产视频 | 国产欧美二区 | 亚洲精品综合 | 韩国精品一区二区久久 | 成人欧美一区二区三区视频不卡 | 亚洲精品自产拍在线观看app | 91视频国产一区 | 成人a免费视频播放 |