1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      小程序如何確保每個(gè)頁面都已登陸

      這篇文章主要為大家展示了“小程序如何確保每個(gè)頁面都已登陸”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“小程序如何確保每個(gè)頁面都已登陸”這篇文章吧。

      成都創(chuàng)新互聯(lián)是一家專業(yè)提供集安企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、HTML5、小程序制作等業(yè)務(wù)。10年已為集安眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

      一個(gè)微信小程序中,有首頁,有個(gè)人頁面,還有一些列表頁面,詳情頁面等等,這些頁面大部分是可以分享的。當(dāng)分享出去的頁面被一個(gè)另一個(gè)用戶打開的時(shí)候,這個(gè)頁面怎么確保這個(gè)用戶已經(jīng)登陸了呢?

      網(wǎng)上有很多方案是在請求封裝里面加一道攔截,如果沒有token,就先調(diào)用登陸請求獲取token后,再繼續(xù)。 這種方案沒毛病,只要注意一點(diǎn),當(dāng)一個(gè)頁面有多個(gè)請求同時(shí)觸發(fā)時(shí),當(dāng)所有請求攔截后,放到一個(gè)數(shù)組里面,在獲取token成功后,遍歷數(shù)組一個(gè)個(gè)請求就行。

      但這個(gè)需求再復(fù)雜一點(diǎn),比如連鎖便利店小程序,大部分頁面都需要有一個(gè)門店(因?yàn)樾枰鶕?jù)門店獲取當(dāng)前門店商品的庫存、價(jià)格等),這個(gè)門店是根據(jù)當(dāng)前的定位來調(diào)用后臺接口獲得的,這個(gè)時(shí)候如果在請求里進(jìn)行封裝就太麻煩了。

      解決方案

      首先,我們注意到,登陸,獲取定位與我們的頁面請求是異步的,我們需要保證頁面請求是在登陸和獲取定位之后,但要是我們每個(gè)頁面都寫一個(gè)遍,可維護(hù)性就太差了。所以我們可以抽離出一個(gè)方法來做這件事。 所以代碼就這樣了:

      const app = getApp()
      Page({
        data: {
          logs: []
        },
        onLoad() {
          app.commonLogin(()=>{
              // 處理頁頁面請求
          })
        }
      })

      做到這里好像是解決我們的問題,但再想一想,如果還想做更多的事,比如說每個(gè)頁面的onShareAppMessage統(tǒng)一處理,但我又不想在每個(gè)頁面再寫一遍,另外,我又想自己對每個(gè)頁面實(shí)現(xiàn)一個(gè)watch,怎么做?

      進(jìn)一步解決方案

      我們可以看到微信小程序,每個(gè)頁面是一個(gè)Page(),那么我們可以給這個(gè)Page外面加一層殼子,我們可以有一個(gè)MyPage來替換這個(gè)Page,廢話不多說,上代碼:

      tool.js 相關(guān)代碼

      /**
         * 處理合并參數(shù)
         */
        handlePageParamMerge(arg) {
          let numargs = arg.length; // 獲取被傳遞參數(shù)的數(shù)值。
          let data = {}
          let page = {}
          for (let ix in arg) {
            let item = arg[ix]
            if (item.data && typeof (item.data) === 'object') {
              data = Object.assign(data, item.data)
            }
            if (item.methods && typeof (item.methods) === 'object') {
              page = Object.assign(page, item.methods)
            } else {
              page = Object.assign(page, item)
            }
          }
          page.data = data
          return page
        }
      
        /***
         * 合并頁面方法以及數(shù)據(jù), 兼容 {data:{}, methods: {}} 或 {data:{}, a:{}, b:{}}
         */
        mergePage() {
          return this.handlePageParamMerge(arguments)
        }
      
        /**
         * 處理組件參數(shù)合并
         */
        handleCompParamMerge(arg) {
          let numargs = arg.length; // 獲取被傳遞參數(shù)的數(shù)值。
          let data = {}
          let options = {}
          let properties = {}
          let methods = {}
          let comp = {}
          for (let ix in arg) {
            let item = arg[ix]
            // 合并組件的初始數(shù)據(jù)
            if (item.data && typeof (item.data) === 'object') {
              data = Object.assign(data, item.data)
            }
            // 合并組件的屬性列表
            if (item.properties && typeof (item.properties) === 'object') {
              properties = Object.assign(properties, item.properties)
            }
            // 合組件的方法列表
            if (item.methods && typeof (item.methods) === 'object') {
              methods = Object.assign(methods, item.methods)
            }
            if (item.options && typeof (item.options) === 'object') {
              options = Object.assign(options, item.options)
            }
            comp = Object.assign(comp, item)
          }
          comp.data = data
          comp.options = options
          comp.properties = properties
          comp.methods = methods
          return comp
        }
      
        /**
         * 組件混合 {properties: {}, options: {}, data:{}, methods: {}}
         */
        mergeComponent() {
          return this.handleCompParamMerge(arguments)
        }
      
        /***
         * 合成帶watch的頁面
         */
        newPage() {
          let options = this.handlePageParamMerge(arguments)
          let that = this
          let app = getApp()
      
          //增加全局點(diǎn)擊登錄判斷
          if (!options.publicCheckLogin){
            options.publicCheckLogin = function (e) {
              let pages = getCurrentPages()
              let page = pages[pages.length - 1]
              let dataset = e.currentTarget.dataset
              let callback = null
      
              //獲取回調(diào)方法
              if (dataset.callback && typeof (page[dataset.callback]) === "function"){
                callback = page[dataset.callback]
              }
              // console.log('callback>>', callback, app.isRegister())
              //判斷是否登錄
              if (callback && app.isRegister()){
                callback(e)
              }
              else{
                wx.navigateTo({
                  url: '/pages/login/login'
                })
              }
            }
          }
      
          const { onLoad } = options
          options.onLoad = function (arg) {
            options.watch && that.setWatcher(this)
            onLoad && onLoad.call(this, arg)
          }
      
          const { onShow } = options
          options.onShow = function (arg) {
            if (options.data.noAutoLogin || app.isRegister()) {
              onShow && onShow.call(this, arg)
              //頁面埋點(diǎn)
              app.ga({})
            }
            else {
              wx.navigateTo({
                url: '/pages/login/login'
              })
            }
          }
      
          return Page(options)
        }
      
        /**
         * 合成帶watch等的組件
         */
        newComponent() {
          let options = this.handleCompParamMerge(arguments)
          let that = this
          const { ready } = options
          options.ready = function (arg) {
            options.watch && that.setWatcher(this)
            ready && ready.call(this, arg)
          }
          return Component(options)
        }
      
        /**
          * 設(shè)置監(jiān)聽器
          */
        setWatcher(page) {
          let data = page.data;
          let watch = page.watch;
          Object.keys(watch).forEach(v => {
            let key = v.split('.'); // 將watch中的屬性以'.'切分成數(shù)組
            let nowData = data; // 將data賦值給nowData
            for (let i = 0; i < key.length - 1; i++) { // 遍歷key數(shù)組的元素,除了最后一個(gè)!
              nowData = nowData[key[i]]; // 將nowData指向它的key屬性對象
            }
      
            let lastKey = key[key.length - 1];
            // 假設(shè)key==='my.name',此時(shí)nowData===data['my']===data.my,lastKey==='name'
            let watchFun = watch[v].handler || watch[v]; // 兼容帶handler和不帶handler的兩種寫法
            let deep = watch[v].deep; // 若未設(shè)置deep,則為undefine
            this.observe(nowData, lastKey, watchFun, deep, page); // 監(jiān)聽nowData對象的lastKey
          })
        }
      
        /**
         * 監(jiān)聽屬性 并執(zhí)行監(jiān)聽函數(shù)
         */
        observe(obj, key, watchFun, deep, page) {
          var val = obj[key];
          // 判斷deep是true 且 val不能為空 且 typeof val==='object'(數(shù)組內(nèi)數(shù)值變化也需要深度監(jiān)聽)
          if (deep && val != null && typeof val === 'object') {
            Object.keys(val).forEach(childKey => { // 遍歷val對象下的每一個(gè)key
              this.observe(val, childKey, watchFun, deep, page); // 遞歸調(diào)用監(jiān)聽函數(shù)
            })
          }
          var that = this;
          Object.defineProperty(obj, key, {
            configurable: true,
            enumerable: true,
            set: function (value) {
              if (val === value) {
                return
              }
              // 用page對象調(diào)用,改變函數(shù)內(nèi)this指向,以便this.data訪問data內(nèi)的屬性值
              watchFun.call(page, value, val); // value是新值,val是舊值
              val = value;
              if (deep) { // 若是深度監(jiān)聽,重新監(jiān)聽該對象,以便監(jiān)聽其屬性。
                that.observe(obj, key, watchFun, deep, page);
              }
            },
            get: function () {
              return val;
            }
          })
        }

      頁面代碼:

      app.tool.newPage({
        data: {
          // noAutoLogin: false
        },
        onShow: function () {
          // 在這里寫頁面請求邏輯
        }
      }

      以上是“小程序如何確保每個(gè)頁面都已登陸”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


      網(wǎng)頁題目:小程序如何確保每個(gè)頁面都已登陸
      標(biāo)題路徑:http://ef60e0e.cn/article/pjhdoh.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        洛南县| 布尔津县| 祁东县| 沁阳市| 阳山县| 手游| 山西省| 玛多县| 获嘉县| 延长县| 石台县| 阳春市| 邵阳市| 逊克县| 临城县| 乌兰浩特市| 巴青县| 平定县| 都江堰市| 洛川县| 射洪县| 湖南省| 青龙| 宜州市| 肥乡县| 葫芦岛市| 资中县| 桑日县| 鲜城| 建阳市| 东乡县| 仪征市| 峨山| 吉木乃县| 云霄县| 黄山市| 平昌县| 永昌县| 桂阳县| 郑州市| 新余市|