一区二区三区欧美日韩-一区二区三区欧美-一区二区三区免费在线视频-一区二区三区免费在线观看-久久精品店-久久精品第一页

歡迎您光臨深圳塔燈網絡科技有限公司!
電話圖標 余先生:13699882642

網站百科

為您解碼網站建設的點點滴滴

小程序技能進階回憶錄 - 如何改變 onLoad 的執行時機

發表日期:2019-11 文章編輯:小燈 瀏覽次數:4594

人活著,總得要點英雄主義的,哪怕失敗、死亡。

也許在小程序所有生命周期里,我們用的最多的就是 onLoad,一大堆代碼都要在初始化的時候執行。

很多時候,初始化的代碼是每個頁面共用的,比如獲取用戶信息、獲取定位等:

Page({
  onLoad() {
    this.userData = getUserData()
    wx.getLocation({
      type: 'wgs84',
      success (res) {
        // 業務代碼
        // ...
      }
    })
  }
  // ...
})

久而久之,每個頁面的 js 里都是如上的重復代碼。如果可以先執行完通用的初始化代碼,再執行每個頁面各自的 onLoad 多好,可惜小程序并沒有提供類似的鉤子函數,那就自己來吧。

代理 onLoad

按照前幾篇的方法,可以代理原有的 onLoad 事件:

var originPage = Page

function MyPage(config) {
  this.lifetimeBackup = {
    onLoad: config.onLoad
  }
  config.onLoad = function(options) {
    // 自定義代碼
    // 公共的初始化代碼
    this.userData = getUserData()
     wx.getLocation({
      type: 'wgs84',
      success (res) {
        // 執行 onLoad
        this.lifetimeBackup.onLoad.call(this, options)
      }
    })
  }
  
  // ...

  originPage(config)
}

當然,實際開發過程中的初始化代碼不可能這么少,可以用很多方式把它抽離出去,比如這樣:

// utils/initial.js
function initial(callback) {
  this.userData = getUserData()
  wx.getLocation({
    type: 'wgs84',
    success (res) {
      callback()
    }
  })
}
  
// utils/wx.js
var initial = require('./initial')
var originPage = Page

function MyPage(config) {
  this.lifetimeBackup = {
    onLoad: config.onLoad
  }
  config.onLoad = function(options) {
    initial(() => {
      this.lifetimeBackup.onLoad.call(this, options)
    })
  }
  // ...
  originPage(config)
}

也可以使用更多高級的方法抽離出去,比如 event bus 之類的,就不多贅述。

看似很簡單,但其實這樣忽略了一個問題 —— 生命周期順序被打亂了!如果初始化方法里有異步代碼,那首先執行的可能就是 onShow ,而不是約定的 onLoad

恢復生命周期順序

為了保證生命周期函數能夠按順序執行,可以先臨時清空生命周期函數,然后再依次執行,如下代碼所示:

// utils/wx.js
const LIFETIME_EVENTS = ['onLoad', 'onShow', 'onReady']
var initial = require('./initial')
var originPage = Page


function MyPage(config) {
  LIFETIME_EVENTS.forEach((event) => {
    // 備份生命周期函數
    this.lifetimeBackup[event] = config[event]
    // 臨時清空
    config[event] = function() {}
  })
  config.onLoad = function(options) {
    initial(() => {
      // 依次執行生命周期函數
      LIFETIME_EVENTS.forEach((event) => {
        this.lifetimeBackup[event].call(this, options)
      })
    })
  }
  // ...
  originPage(config)
}

注意上述代碼還是有問題的,當小程序業務跳走再返回或者切后臺到前臺時,onShow 無法正常觸發,因為被設置為空函數了。

為了保證 onShow 等生命周期函數的后續正常運行,需要在依次執行完生命周期函數后,再把它們恢復到 config 下,這是必不可少的。完整代碼如下:

// utils/wx.js
const LIFETIME_EVENTS = ['onLoad', 'onShow', 'onReady']
var initial = require('./initial')
var originPage = Page


function MyPage(config) {
  LIFETIME_EVENTS.forEach((event) => {
    // 備份生命周期函數
    this.lifetimeBackup[event] = config[event]
    // 臨時清空
    config[event] = function() {}
  })
  config.onLoad = function(options) {
    initial(() => {
      // 依次執行生命周期函數
      LIFETIME_EVENTS.forEach((event) => {
        this.lifetimeBackup[event].call(this, options)
        // 執行完后,恢復過來
        config[event] = this.lifetimeBackup[event]
      })
    })
  }
  // ...
  originPage(config)
}

總結

代理了 onLoad 后,就可以手動控制其執行的時機,可以折騰的事情就多了很多。比如當初始化函數需要執行(請求)的內容比較多,耗時比較長時,可以統一給頁面增加一些 loading 提示等。總之,可以自由控制了。


本頁內容由塔燈網絡科技有限公司通過網絡收集編輯所得,所有資料僅供用戶學習參考,本站不擁有所有權,如您認為本網頁中由涉嫌抄襲的內容,請及時與我們聯系,并提供相關證據,工作人員會在5工作日內聯系您,一經查實,本站立刻刪除侵權內容。本文鏈接:http://m.junxiaosheng.cn/25252.html
相關小程序
 八年  行業經驗

多一份參考,總有益處

聯系深圳網站公司塔燈網絡,免費獲得網站建設方案及報價

咨詢相關問題或預約面談,可以通過以下方式與我們聯系

業務熱線:余經理:13699882642

Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

主站蜘蛛池模板: 最新国自产拍天天更新| 回复术士人生重启在线观看| 一品道门免费视频韩国| 最近中文字幕在线中文视频| 国产精品久久久久久久久99热| 国产自啪偷啪视频在线| 久久影院毛片一区二区| 欧美最新色p图| 亚洲精品高清在线| 国产成人在线网站| 日韩精品 电影一区 亚洲高清| 亚洲视频在线观看视频| 99久酒店在线精品2019| 老师你下面好紧夹死了| 夜夜骑夜夜欢| 久久人妻少妇嫩草AV蜜桃35I | 女人和男人插曲视频大全| 中文字幕人成人乱码亚洲影视| 短篇合集纯肉高H深陷骚 | 把她带到密室调教性奴| 欧美高清另类video| jizz女学| 色橹橹欧美在线观看视频高| 国产99视频精品免费播放| 思思99精品国产自在现线| 国产精品免费视频能看| 亚洲精品www久久久久久久软件| 啊轻点灬大JI巴又大又粗| 青青娱乐网| 国产精品爽爽久久久久久无码| 欧美重口绿帽video| 一个人HD高清在线观看免费视频| 俄罗斯18xv在线观看| 三八成人网| 果冻传媒在线观看网站| 神马电影dy888午夜我不卡| 国产精品亚洲精品久久国语| 日韩成人在线视频| 国产精品乱码一区二区三| 亚洲精品蜜夜内射| 美女胸禁止18以下看|