资讯专栏INFORMATION COLUMN

小程序onLaunch,onLoad 执行生命周期

curried / 3018人阅读

摘要:本来按照事件顺序,小程序初始化时触发里的,后面再执行页面里的,但是在里请求获取是否有权限,等待返回值的时候里的事件就已经执行了。页面判断一下当前是否有值,如果没有第一次则定义定义一个方法回调函数。

本来按照事件顺序,小程序初始化时触发App里的onLaunch,后面再执行页面Page里的onLoad,但是在onLaunch里请求获取是否有权限,等待返回值的时候Page里的onLoad事件就已经执行了。

//app.js
App({
  onLaunch: function () {
    console.log("onLaunch");
    wx.request({
      url: "test.php", //仅为示例,并非真实的接口地址
      data: {
      },
      success: function(res) {
        console.log("onLaunch-request-success");
        // 将employId赋值给全局变量,提供给页面做判断
        this.globalData.employId = res.employId;   
      }
    })
  },
  globalData: {
    employId: ""
  }
})
//index.js
//获取应用实例
const app = getApp()

Page({
  data: {
    albumDisabled: true,
    bindDisabled: false
  },
  onLoad: function () {
    console.log("onLoad");
    console.log("onLoad app.globalData.employId = " + app.globalData.employId);
    //判断是用户是否绑定了
    if (app.globalData.employId && app.globalData.employId != "") {
      this.setData({
        albumDisabled: false,
        bindDisabled: true
      });
  }
})

控制台打印的结果是

onLaunch
onLoad
onLoad app.globalData.employId = 
onLaunch-request-success

要是能等完onLaunch请求完再执行Page的onLoad方法那该多好。
这里采用的方法是定义一个回调函数。
Page页面判断一下当前app.globalData.employId是否有值,如果没有(第一次)则定义定义一个app方法(回调函数)app.employIdCallback = employId => {...}。
App页面在请求success后判断时候有Page页面定义的回调方法,如果有就执行该方法。因为回调函数是在Page里面定义的所以方法作用域this是指向Page页面。

//app.js
App({
  onLaunch: function () {
    wx.request({
      url: "test.php", //仅为示例,并非真实的接口地址
      data: {
      },
      success: function(res) {
        this.globalData.employId = res.employId;
        //由于这里是网络请求,可能会在 Page.onLoad 之后才返回
        // 所以此处加入 callback 以防止这种情况
        if (this.employIdCallback){
           this.employIdCallback(employId);
        }
      }
    })
  },
  globalData: {
    employId: ""
  }
})
//index.js
//获取应用实例
const app = getApp()

Page({
  data: {
    albumDisabled: true,
    bindDisabled: false
  },
  onLoad: function () {
    //判断是用户是否绑定了
    if (app.globalData.employId && app.globalData.employId != "") {
      this.setData({
        albumDisabled: false,
        bindDisabled: true
      });
    } else {
      // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
      // 所以此处加入 callback 以防止这种情况
      app.employIdCallback = employId => {
        if (employId != "") {
          this.setData({
            albumDisabled: false,
            bindDisabled: true
          });
        }
      }
    }
  }
})

这样的话,就能实现想要的结果。执行顺序就是:

[App] onLaunch -> [Page] onLoad -> [App] onLaunch sucess callback

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93329.html

相关文章

  • 程序生命周期——程序探索

    摘要:运行机制小程序启动会有两种情况,一种是冷启动,一种是热启动。建议小程序在必要时使用监听内存告警事件,进行必要的内存清理。 前言 以小程序为切入点,深入理解总结方方面面的知识点,做成系列文章,希望能得到大神的指点和帮助新人入门,承上启下才是好程序猿由于是系列第一篇文章,紧跟着的是一大段废话,只关心技术的可以跳过 转眼半年又要过去了,意味着来新公司快半年了,离上次写文章也半年了,浑浑噩噩...

    Caizhenhao 评论0 收藏0
  • 微信程序Taro开发(2):生命周期及开发中注意点

    摘要:入口文件继承自组件基类,它同样拥有组件生命周期,但因为入口文件的特殊性,他的生命周期并不完整,如。支持组件化开发,组件代码可以放在任意位置,不过建议放在下的目录中。 生命周期 componentWillMount 在微信小程序中这一生命周期方法对应页面的onLoad或入口文件app中的onLaunch componentDidMount 在微信小程序中这一生命周期方法对应页面的onRe...

    morgan 评论0 收藏0
  • 扩展微信程序 Page 构造函数,修改生命周期函数

    摘要:不直接正题一将公共方法绑定到上单个绑定注意公共函数的名字不要重复,否则覆盖多个绑定,文件绑定需要绑定的函数由文件出来二扩展,修改生命周期函数这里必须使用不可以使用箭头函数,否则指向错误扩展函数在是当前实例上下文中执行,所以当前的为当前实例如 不BB,直接正题 一. 将公共方法绑定到Page上 单个绑定 const oldPage = Page Page = function(app...

    lucas 评论0 收藏0
  • 扩展微信程序 Page 构造函数,修改生命周期函数

    摘要:不直接正题一将公共方法绑定到上单个绑定注意公共函数的名字不要重复,否则覆盖多个绑定,文件绑定需要绑定的函数由文件出来二扩展,修改生命周期函数这里必须使用不可以使用箭头函数,否则指向错误扩展函数在是当前实例上下文中执行,所以当前的为当前实例如 不BB,直接正题 一. 将公共方法绑定到Page上 单个绑定 const oldPage = Page Page = function(app...

    Shonim 评论0 收藏0

发表评论

0条评论

curried

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<