<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

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

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:30:58
        文檔

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

        微信小程序之頁(yè)面攔截器的示例代碼:場(chǎng)景 小程序有52個(gè)頁(yè)面,其中13個(gè)頁(yè)面無(wú)需任何身份,另外39個(gè)頁(yè)面需要系統(tǒng)角色。對(duì)于這39個(gè)頁(yè)面,如果微信用戶沒(méi)有系統(tǒng)角色,則跳轉(zhuǎn)到登錄頁(yè)。 是否有系統(tǒng)角色信息需要通過(guò)異步請(qǐng)求來(lái)獲取。 需求分析&實(shí)現(xiàn) 對(duì)需求進(jìn)行抽象,其實(shí)要的就是一個(gè)過(guò)濾器,對(duì)小
        推薦度:
        導(dǎo)讀微信小程序之頁(yè)面攔截器的示例代碼:場(chǎng)景 小程序有52個(gè)頁(yè)面,其中13個(gè)頁(yè)面無(wú)需任何身份,另外39個(gè)頁(yè)面需要系統(tǒng)角色。對(duì)于這39個(gè)頁(yè)面,如果微信用戶沒(méi)有系統(tǒng)角色,則跳轉(zhuǎn)到登錄頁(yè)。 是否有系統(tǒng)角色信息需要通過(guò)異步請(qǐng)求來(lái)獲取。 需求分析&實(shí)現(xiàn) 對(duì)需求進(jìn)行抽象,其實(shí)要的就是一個(gè)過(guò)濾器,對(duì)小

        場(chǎng)景

      1. 小程序有52個(gè)頁(yè)面,其中13個(gè)頁(yè)面無(wú)需任何身份,另外39個(gè)頁(yè)面需要系統(tǒng)角色。對(duì)于這39個(gè)頁(yè)面,如果微信用戶沒(méi)有系統(tǒng)角色,則跳轉(zhuǎn)到登錄頁(yè)。
      2. 是否有系統(tǒng)角色信息需要通過(guò)異步請(qǐng)求來(lái)獲取。
      3. 需求分析&實(shí)現(xiàn)

        對(duì)需求進(jìn)行抽象,其實(shí)要的就是一個(gè)過(guò)濾器,對(duì)小程序頁(yè)面的訪問(wèn)進(jìn)行過(guò)濾,符合條件的通過(guò),不符合條件進(jìn)行其他處理。

        使用過(guò)php的laravel框架的童鞋,肯定一下子就聯(lián)想到了laravel框架的http中間件:

        HTTP 中間件提供一個(gè)方便的機(jī)制來(lái)過(guò)濾進(jìn)入應(yīng)用程序的 HTTP 請(qǐng)求,例如,Laravel 默認(rèn)包含了一個(gè)中間件來(lái)檢驗(yàn)用戶身份驗(yàn)證,如果用戶沒(méi)有經(jīng)過(guò)身份驗(yàn)證,中間件會(huì)將用戶導(dǎo)向登錄頁(yè)面,然而,如果用戶通過(guò)身份驗(yàn)證,中間件將會(huì)允許這個(gè)請(qǐng)求進(jìn)一步繼續(xù)前進(jìn)。當(dāng)然,除了身份驗(yàn)證之外,中間件也可以被用來(lái)執(zhí)行各式各樣的任務(wù),CORS 中間件負(fù)責(zé)替所有即將離開程序的響應(yīng)加入適當(dāng)?shù)捻憫?yīng)頭,一個(gè)日志中間件可以記錄所有傳入應(yīng)用程序的請(qǐng)求。

        令人憂桑的是,微信小程序并沒(méi)有提供針對(duì)Page實(shí)例的中間件機(jī)制。所以只能從Page實(shí)例的生命周期處下手。

        對(duì)于onLoad,一個(gè)頁(yè)面只會(huì)調(diào)用一次;對(duì)于onShow,每次打開頁(yè)面(比如小程序從后臺(tái)轉(zhuǎn)到前臺(tái))都會(huì)調(diào)用一次。

        在onLoad或者onShow鉤子函數(shù)里,對(duì)用戶身份進(jìn)行校驗(yàn),通過(guò)后則拉取該頁(yè)面需要的數(shù)據(jù),否則跳轉(zhuǎn)到登錄頁(yè)。

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

        不過(guò),每個(gè)頁(yè)面都要這樣寫,重復(fù)代碼好多啊,侵入性也強(qiáng)。不如用裝飾函數(shù)(高大上的說(shuō)法是裝飾者模式)來(lái)包裝一下:

        //filter.js
        function identityFilter(pageObj){
         if(pageObj.onShow){
         let _onShow = pageObj.onShow;
         pageObj.onShow = function(){
         service.identityCheck(()=>{
         //跳轉(zhuǎn)到登錄頁(yè)
         wx.redirectTo({
         url: "/pages/common/login/login"
         });
         },()=>{
         //獲取頁(yè)面實(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用以提供過(guò)濾器方法,除了現(xiàn)有的用戶身份攔截,后續(xù)如果需要其他攔截,可以在這個(gè)文件增加。然后,在需要用戶身份攔截的小程序頁(yè)面代碼里,用filter.identityFilter處理一下就可以了:

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

        使用Promise進(jìn)行優(yōu)化

        上面的實(shí)現(xiàn)中,每次訪問(wèn)頁(yè)面,都會(huì)執(zhí)行一次獲取用戶身份的方法(就是上面代碼里的service. identityCheck )。其實(shí)沒(méi)有必要,在小程序啟動(dòng)的時(shí)候獲取一次就行了。也就是說(shuō),放在app.js的onLaunch方法里執(zhí)行。

        每個(gè)小程序頁(yè)面實(shí)例化時(shí),一般也會(huì)執(zhí)行異步方法,用來(lái)獲取頁(yè)面需要的數(shù)據(jù)。關(guān)鍵在于,我們需要保證,頁(yè)面的異步方法 必須在 獲取用戶身份的異步請(qǐng)求 之后執(zhí)行。

        毋容置疑,Promise最擅長(zhǎng)處理異步請(qǐng)求的執(zhí)行順序了。主子,快放代碼粗來(lái):

        //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(){
         //改動(dòng)點(diǎn)
         appData.promise.then(()=>{
         //跳轉(zhuǎn)到登錄頁(yè)
         wx.redirectTo({
         url: "/pages/common/login/login"
         });
         },()=>{
         //獲取頁(yè)面實(shí)例,防止this劫持
         let currentInstance = getPageInstance();
         _onShow.call(currentInstance);
         });
         }
         }
         return pageObj;
        }
        

        小結(jié)

        基本實(shí)現(xiàn)了小程序頁(yè)面的用戶身份攔截器,但是比起laravel的http中間件還是遜色一些:

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

        文檔

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

        微信小程序之頁(yè)面攔截器的示例代碼:場(chǎng)景 小程序有52個(gè)頁(yè)面,其中13個(gè)頁(yè)面無(wú)需任何身份,另外39個(gè)頁(yè)面需要系統(tǒng)角色。對(duì)于這39個(gè)頁(yè)面,如果微信用戶沒(méi)有系統(tǒng)角色,則跳轉(zhuǎn)到登錄頁(yè)。 是否有系統(tǒng)角色信息需要通過(guò)異步請(qǐng)求來(lái)獲取。 需求分析&實(shí)現(xiàn) 對(duì)需求進(jìn)行抽象,其實(shí)要的就是一個(gè)過(guò)濾器,對(duì)小
        推薦度:
        標(biāo)簽: 小程序 微信小程序 攔截
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 巨波霸乳在线永久免费视频 | 亚洲综合久久综合激情久久| 精品97国产免费人成视频| 亚洲国产成人五月综合网| 国产精品免费久久久久影院| 亚洲美日韩Av中文字幕无码久久久妻妇| 国产精品亚洲专区无码牛牛| 国产禁女女网站免费看| 国产亚洲Av综合人人澡精品| 亚洲精品在线视频| 中文字幕无线码免费人妻| 亚洲国产精华液网站w| 久久这里只精品热免费99| 亚洲精品无码久久久久久久| 99久久免费国产香蕉麻豆| 亚洲成a人片7777| 在线观看免费大黄网站| 亚洲6080yy久久无码产自国产| 免费大片在线观看网站| 中文毛片无遮挡高清免费| 久久丫精品国产亚洲av| 成年在线网站免费观看无广告| 亚洲6080yy久久无码产自国产| 久久亚洲精品无码播放| 久别的草原电视剧免费观看| 亚洲国产成人99精品激情在线| 精品免费国产一区二区三区| 久青草视频97国内免费影视| 亚洲综合综合在线| 免费观看一级毛片| 中国一级全黄的免费观看| 亚洲精品**中文毛片| 国产大片免费观看中文字幕| 最近中文字幕大全免费版在线 | 亚洲国产主播精品极品网红| 国产亚洲精品免费视频播放 | 综合偷自拍亚洲乱中文字幕| 亚洲精品~无码抽插| 在线免费不卡视频| baoyu777永久免费视频| 国产.亚洲.欧洲在线|