国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程序 小程序開發(fā) 淺談小程序確保每個頁面都已登陸的方法

淺談小程序確保每個頁面都已登陸的方法

Dec 27, 2021 am 10:23 AM
小程序

微信小程序如何確保每個頁面都已經(jīng)登陸?本篇文章給大家介紹一下小程序確保每個頁面都登陸的方法,希望對大家有所幫助!

淺談小程序確保每個頁面都已登陸的方法

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

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

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

解決方案

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

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

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

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

我們可以看到微信小程序,每個頁面是一個Page(),那么我們可以給這個Page外面加一層殼子,我們可以有一個MyPage來替換這個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ù)組的元素,除了最后一個!
        nowData = nowData[key[i]]; // 將nowData指向它的key屬性對象
      }

      let lastKey = key[key.length - 1];
      // 假設(shè)key===&#39;my.name&#39;,此時(shí)nowData===data[&#39;my&#39;]===data.my,lastKey===&#39;name&#39;
      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===&#39;object&#39;(數(shù)組內(nèi)數(shù)值變化也需要深度監(jiān)聽)
    if (deep && val != null && typeof val === &#39;object&#39;) {
      Object.keys(val).forEach(childKey => { // 遍歷val對象下的每一個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 () {
    // 在這里寫頁面請求邏輯
  }
}

最后

代碼是在線上跑了很久的,tool里的newPage封裝,你可以根據(jù)自己的需求進(jìn)行添加??傊?,我這里是提供一種思路,如有更佳,歡迎分享。

【相關(guān)學(xué)習(xí)推薦:小程序開發(fā)教程

以上是淺談小程序確保每個頁面都已登陸的方法的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

使用Python開發(fā)微信小程序 使用Python開發(fā)微信小程序 Jun 17, 2023 pm 06:34 PM

隨著移動互聯(lián)網(wǎng)技術(shù)和智能手機(jī)的普及,微信成為了人們生活中不可或缺的一個應(yīng)用。而微信小程序則讓人們可以在不需要下載安裝應(yīng)用的情況下,直接使用小程序來解決一些簡單的需求。本文將介紹如何使用Python來開發(fā)微信小程序。一、準(zhǔn)備工作在使用Python開發(fā)微信小程序之前,需要安裝相關(guān)的Python庫。這里推薦使用wxpy和itchat這兩個庫。wxpy是一個微信機(jī)器

實(shí)現(xiàn)微信小程序中的卡片翻轉(zhuǎn)特效 實(shí)現(xiàn)微信小程序中的卡片翻轉(zhuǎn)特效 Nov 21, 2023 am 10:55 AM

實(shí)現(xiàn)微信小程序中的卡片翻轉(zhuǎn)特效在微信小程序中,實(shí)現(xiàn)卡片翻轉(zhuǎn)特效是一種常見的動畫效果,可以提升用戶體驗(yàn)和界面交互的吸引力。下面將具體介紹如何在微信小程序中實(shí)現(xiàn)卡片翻轉(zhuǎn)的特效,并提供相關(guān)代碼示例。首先,需要在小程序的頁面布局文件中定義兩個卡片元素,一個用于顯示正面內(nèi)容,一個用于顯示背面內(nèi)容,具體示例代碼如下:&lt;!--index.wxml--&gt;&l

支付寶上線'漢字拾光-生僻字”小程序,用于征集、補(bǔ)充生僻字庫 支付寶上線'漢字拾光-生僻字”小程序,用于征集、補(bǔ)充生僻字庫 Oct 31, 2023 pm 09:25 PM

本站10月31日消息,今年5月27日,螞蟻集團(tuán)宣布啟動“漢字拾光計(jì)劃”,最近又迎來新進(jìn)展:支付寶上線“漢字拾光-生僻字”小程序,用于向社會征集生僻字,補(bǔ)充生僻字庫,同時(shí)提供不同的生僻字輸入體驗(yàn),以幫助完善支付寶內(nèi)的生僻字輸入方法。目前,用戶搜索“漢字拾光”、“生僻字”等關(guān)鍵詞就可以進(jìn)入“生僻字”小程序。在小程序里,用戶可以提交尚未被系統(tǒng)識別錄入的生僻字圖片,支付寶工程師在確認(rèn)后,將會對字庫進(jìn)行補(bǔ)錄入。本站注意到,用戶還可以在小程序體驗(yàn)最新的拆字輸入法,這一輸入法針對讀音不明確的生僻字設(shè)計(jì)。用戶拆

小程序能用react嗎 小程序能用react嗎 Dec 29, 2022 am 11:06 AM

小程序能用react,其使用方法:1、基于“react-reconciler”實(shí)現(xiàn)一個渲染器,生成一個DSL;2、創(chuàng)建一個小程序組件,去解析和渲染DSL;3、安裝npm,并執(zhí)行開發(fā)者工具中的構(gòu)建npm;4、在自己的頁面中引入包,再利用api即可完成開發(fā)。

uniapp如何實(shí)現(xiàn)小程序和H5的快速轉(zhuǎn)換 uniapp如何實(shí)現(xiàn)小程序和H5的快速轉(zhuǎn)換 Oct 20, 2023 pm 02:12 PM

uniapp如何實(shí)現(xiàn)小程序和H5的快速轉(zhuǎn)換,需要具體代碼示例近年來,隨著移動互聯(lián)網(wǎng)的發(fā)展和智能手機(jī)的普及,小程序和H5成為了不可或缺的應(yīng)用形式。而uniapp作為一個跨平臺的開發(fā)框架,可以在一套代碼的基礎(chǔ)上,快速實(shí)現(xiàn)小程序和H5的轉(zhuǎn)換,大大提高了開發(fā)效率。本文將介紹uniapp如何實(shí)現(xiàn)小程序和H5的快速轉(zhuǎn)換,并給出具體的代碼示例。一、uniapp簡介unia

教你如何在小程序中用公眾號模板消息(附詳細(xì)思路) 教你如何在小程序中用公眾號模板消息(附詳細(xì)思路) Nov 04, 2022 pm 04:53 PM

本篇文章給大家?guī)砹岁P(guān)于微信小程序的相關(guān)問題,其中主要介紹了如何在小程序中用公眾號模板消息,下面一起來看一下,希望對大家有幫助。

用Python編寫簡單的聊天程序教程 用Python編寫簡單的聊天程序教程 May 08, 2023 pm 06:37 PM

實(shí)現(xiàn)思路x01服務(wù)端的建立首先,在服務(wù)端,使用socket進(jìn)行消息的接受,每接受一個socket的請求,就開啟一個新的線程來管理消息的分發(fā)與接受,同時(shí),又存在一個handler來管理所有的線程,從而實(shí)現(xiàn)對聊天室的各種功能的處理x02客戶端的建立客戶端的建立就要比服務(wù)端簡單多了,客戶端的作用只是對消息的發(fā)送以及接受,以及按照特定的規(guī)則去輸入特定的字符從而實(shí)現(xiàn)不同的功能的使用,因此,在客戶端這里,只需要去使用兩個線程,一個是專門用于接受消息,一個是專門用于發(fā)送消息的至于為什么不用一個呢,那是因?yàn)?只

PHP與小程序的地理位置定位與地圖顯示 PHP與小程序的地理位置定位與地圖顯示 Jul 04, 2023 pm 04:01 PM

PHP與小程序的地理位置定位與地圖顯示地理位置定位與地圖顯示在現(xiàn)代科技中已經(jīng)成為了必備的功能之一。隨著移動設(shè)備的普及,人們對于定位和地圖顯示的需求也越來越高。在開發(fā)過程中,PHP和小程序是常見的兩種技術(shù)選擇。本文將為大家介紹PHP與小程序中的地理位置定位與地圖顯示的實(shí)現(xiàn)方法,并附上相應(yīng)的代碼示例。一、PHP中的地理位置定位在PHP中,我們可以使用第三方地理位

See all articles