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

歡迎您光臨深圳塔燈網絡科技有限公司!
電話圖標 余先生: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://www.junxiaosheng.cn/25252.html
相關小程序
 八年  行業經驗

多一份參考,總有益處

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

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

業務熱線:余經理:13699882642

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

主站蜘蛛池模板: 欧美麻豆一精品一AV一免费| 美国大臿蕉香蕉大视频| 在线 中文字幕| 正在播放国产精品| 99久久精品国产亚洲AV| 第一会所欧美无码原创| 国产精品无码麻豆放荡AV| 精品免费久久久久久影院 | 久久精品天天爽夜夜爽| 免费观看亚洲视频| 少妇一夜未归暴露妓女身份| 小柔的性放荡羞辱日记| 中文字幕本庄优花喂奶| 久久机热免费视频| 同时和两老师双飞| 91嫩草视频在线观看| 国产人妻精品午夜福利免费不卡 | 亚洲色噜噜狠狠站欲八| jiizzyou欧美喷液| 精品无码无人网站免费视频| 亚洲精品久久区二区三区蜜桃臀| 新图解av吧| 国产一浮力影院| 日本在线免费| 一级做a爰片久久毛片一| 国产产一区二区三区久久毛片国语| 久久精品天天爽夜夜爽| 怡春院欧美一区二区三区免费| 国产精品自在自线亚洲| 亚洲AV精品一区二区三区不卡 | 中文字幕一区二区视频| 国产欧美精品一区二区三区-老狼 国产欧美精品国产国产专区 | 尿孔 调教 扩张| 伊人久久综合热青草| 两性午夜色视频免费网站| 亚洲精品成人无码A片在线| 精品美女国产互换人妻| 97超在线视频| 无码国产精品高潮久久9| 福利视频久久| 强上轮流内射高NP男男|