欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

場景

和平網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),和平網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為和平上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個(gè)售后服務(wù)好的和平做網(wǎng)站的公司定做!

  • 小程序有52個(gè)頁面,其中13個(gè)頁面無需任何身份,另外39個(gè)頁面需要系統(tǒng)角色。對于這39個(gè)頁面,如果微信用戶沒有系統(tǒng)角色,則跳轉(zhuǎn)到登錄頁。
  • 是否有系統(tǒng)角色信息需要通過異步請求來獲取。

需求分析&實(shí)現(xiàn)

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

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

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

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

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

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

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

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

不過,每個(gè)頁面都要這樣寫,重復(fù)代碼好多啊,侵入性也強(qiáng)。不如用裝飾函數(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"
        });
      },()=>{
        //獲取頁面實(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用以提供過濾器方法,除了現(xiàn)有的用戶身份攔截,后續(xù)如果需要其他攔截,可以在這個(gè)文件增加。然后,在需要用戶身份攔截的小程序頁面代碼里,用filter.identityFilter處理一下就可以了:

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

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

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

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

小結(jié)

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

  • 需要對每個(gè)頁面代碼包裝一層。
  • 即使用戶身份校驗(yàn)不通過,小程序也并不會(huì)阻塞頁面的渲染。假如獲取用戶身份的異步方法一分鐘才執(zhí)行完,小程序頁面還是會(huì)展示出來,一分鐘之后才跳轉(zhuǎn)到登錄頁。需要自己增加邏輯,比如在這一分鐘內(nèi),頁面展示空白內(nèi)容。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

標(biāo)題名稱:微信小程序之頁面攔截器的示例代碼
URL分享:http://aaarwkj.com/article26/jjjocg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器動(dòng)態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
国产胖中年妇女草逼网站| 日韩亚洲国产欧美在线观看| 精品毛片av一区二区三区| 精品黄色大片不卡国产| 亚洲激情视频在线视频| 欧美aⅴ精品一区二区三区| 精品国产乱码一区二区三区| 超碰香蕉在线在线观看| 亚洲欧美日韩综合精品久久| 91久久国产免费网站| 日韩精品视频在线观看| 日本久久在线观看视频| 国产成人av在线观看| 国产极品嫩模在线观看91| 日韩欧美一二区久久麻豆| 国产自偷一区二区三区| 欧美日韩另类综合久久久| 亚洲综合色婷婷七月丁香| 日本91免费在线观看| 国产白丝免费在线观看| 日韩 在线一区二区| 亚洲一区二区精品自拍| 亚洲黄色av网站在线| 久久99久久久国产精品| 国产精品日韩一区视频| 久久国产欧美日韩精品| 国产91在线一区精品| 91福利免费在线看| 日韩精品一区二区三区四区在线视频 | 中文字幕乱码亚州精品一区| av成人黄色片在线播放| 黄色录像一级大片中国的| 久久蜜臀av一区三区| 97日韩在线免费视频网站| 情五月激情亚洲丁香佳色| 一区二区亚洲国产精品| 日本成人在线播放网站| 国产精品久久久久精品综合| 午夜福利视频欧美成人| 国产三级国产剧情国产av| 亚洲av最近在线观看|