(微信小程序)onload()加载不到app.globalData全局变量的值

本文探讨了在微信小程序中,全局变量在不同页面onLoad()函数中的加载顺序问题,及如何通过添加loading和定时器解决变量加载延迟,确保数据正确加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

onLoad()加载不到app.globalData全局变量的值

app.js

   globalData: {
       statusResult:null,
   }

index.js

	wx.request({
	   url: 'xxx',
	   method: 'POST',
	   header: {
	     'content-type': 'application/json',
	   },
	   success: function (res) {
	     var dataInfo = res.data.data;
	     var name = [];
	     for (let i in dataInfo) {
	       name  = dataInfo[i].Items.name
	     }
	     app.globalData.statusResult = name;  //把数据存到全局变量中
	   }
	 })

device.js

  data: {
    statusResult:[]
  },
  onLoad: function () {
    this.setData({
      statusResult: app.globalData.statusResult  
    })
  },

我最后打印出来的结果,是先执行decive.js中的onload(),获取到的全局变量是null,然后再执行的index.js中的请求。
试了好多方法,最后还是加了个loading 和定时器解决了这个问题

  onLoad: function () {
      var that = this;
      wx.showLoading({
         title: '加载中',
      })
     setTimeout(function () {
        that.setData({
           statusResult : app.globalData.statusResult
        })
       wx.hideLoading()
     }, 1000)
  },

<think>好的,用户的问题是如何在微信小程序中调用定义在app.js中的方法。我需要根据提供的引用内容来整理步骤,确保回答正确。 首先,用户可能需要知道如何定义全局方法。引用2提到在app.js中使用App()定义全局方法,比如globalFn。然后在页面中使用getApp()获取app实例,再调用app.globalFn()。这应该是基本步骤。 然后,用户提到的场景可能涉及跨页面调用,比如在app.js里处理事件时需要触发页面里的方法。引用3提到在app.js中保存页面实例,比如使用var page = getCurrentPages(),然后调用page中的方法。不过需要注意页面栈的存在情况,可能要在页面的onLoad和onUnload中注册和注销实例,避免内存泄漏。 另外,用户可能关心如何传递数据。引用1和2都提到使用globalData,可以在app.js中设置全局变量,在各个页面中通过app.globalData访问和修改。比如在app.js中设置globalData.pageName,然后在页面中更新它。 还需要注意生命周期的问题,比如在onLoad获取app实例,并确保方法调用在实例化之后。同时,引用4提到的事件处理可能相关,比如在app.js中处理用户信息,但用户的问题更侧重于方法调用,所以这部分可能不太相关。 总结步骤应该是:定义全局方法→在页面获取app实例→调用方法。对于app.js调用页面方法的情况,需要页面先注册到app.js的全局变量中,然后通过保存的实例来调用方法。 需要检查是否有遗漏的细节,比如使用getCurrentPages()的注意事项,页面栈可能为空的情况如何处理。同时,提醒用户关于作用域和生命周期的注意事项,确保方法调用的时机正确。 最后,生成相关问题,帮助用户深入理解,比如全局变量的使用、跨页面通信的其他方法等。</think>### 微信小程序调用 app.js 方法完整指南 以下分步骤说明如何在小程序中定义和调用全局方法,并处理跨页面交互场景: #### 一、定义全局方法 在 `app.js` 中通过 `App()` 函数声明全局方法: ```javascript // app.js App({ // 全局数据存储 globalData: { currentPage: null }, // 全局方法定义 globalFn: function() { console.log('全局方法被调用'); }, // 跨页面调用方法(需结合页面实例) triggerPageMethod: function() { if (this.globalData.currentPage) { this.globalData.currentPage.onRemoteEvent(); } } }); ``` #### 二、页面调用全局方法 在页面中通过 `getApp()` 获取应用实例: ```javascript // page.js const app = getApp(); Page({ onLoad() { // 注册页面实例到全局(用于反向调用) app.globalData.currentPage = this; // 调用全局方法 app.globalFn(); // 访问全局数据 console.log(app.globalData.userInfo); }, onUnload() { // 注销页面实例 app.globalData.currentPage = null; }, // 供全局调用的页面方法 onRemoteEvent() { wx.showToast({ title: '收到全局触发事件' }); } }); ``` #### 三、特殊场景处理(App.js触发页面更新) 对于音视频通话等需要跨页面控制的场景: ```javascript // app.js App({ // 处理来电事件 handleIncomingCall() { const pages = getCurrentPages(); const currentPage = pages[pages.length-1]; if (currentPage.route === 'pages/call/call') { currentPage.onCallReceived(); } else { wx.navigateTo({ url: '/pages/call/call' }); } } }); ``` #### 四、注意事项 1. **生命周期控制**:在 `onLoad` 注册实例,`onUnload` 必须注销,避免内存泄漏 2. **页面栈限制**:`getCurrentPages()` 只能获取5层页面栈,复杂场景建议使用事件总线 3. **数据响应**:修改 `globalData` 不会自动触发视图更新,需配合 `setData` 使用 4. **异步处理**:跨页面调用建议使用 `wx.nextTick` 确保页面渲染完成
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值