小程序框架接口-getApp

本文详细介绍了微信小程序中如何通过getApp()获取全局App实例,实现数据和方法共享,以及页面间通信的EventChannel机制。还探讨了如何自定义导航栏以适应设计需求。

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

框架接口-getApp

getApp() 用于获取小程序全局唯一的 App 实例,通过小程序应用实例可实现数据或方法的共享

📌 注意事项

  1. 1.不要在 App() 方法中使用 getApp() ,使用 this 就可以拿到 app 实例
  2. 通过 getApp() 获取实例之后,不要私自调用生命周期函数

落地代码:

➡️ app.js

App({

  // 全局共享的数据
  globalData: {
    token: ''
  },

  // 全局共享的方法
  setToken (token) {
    // 如果想获取 token,可以使用 this 的方式进行获取
    this.globalData.token = token

    // 在 App() 方法中如果想获取 App() 实例,可以通过 this 的方式进行获取
    // 不能通过 getApp() 方法获取
  }

})

➡️ pages/index/index.js

// getApp() 方法用来获取全局唯一的 App() 实例
const appInstance = getApp()

Page({

  login () {

    // 不要通过 app 实例调用钩子函数
    console.log(appInstance)

    appInstance.setToken('fghioiuytfghjkoiuytghjoiug')

  }

})

小程序页面间通信

如果一个页面通过 wx.navigateTo 打开一个新页面,这两个页面间将建立一条数据通道

  1. wx.navigateTosuccess 回调中通过 EventChannel 对象发射事件

  2. 被打开的页面可以通过 this.getOpenerEventChannel() 方法获得一个 EventChannel 对象,进行监听、发射事件

  3. wx.navigateTo 方法中可以定义 events 配置项接收被打开页面发射的事件

这两个 EventChannel 对象间可以使用 emiton 方法相互发送、监听事件。

落地代码:

页面 .js 文件

Page({

  // 点击按钮触发的事件处理函数
  handler () {

    wx.navigateTo({
      url: '/pages/list/list',
      events: {
        // key:被打开页面通过 eventChannel 发射的事件
        // value:回调函数
        // 为事件添加一个监听器,获取到被打开页面传递给当前页面的数据
        currentevent: (res) => {
          console.log(res)
        }
      },
      success (res) {
        // console.log(res)
        // 通过 success 回调函数的形参,可以获取 eventChannel 对象
        // eventChannel 对象给提供了 emit 方法,可以发射事件,同时携带参数
        res.eventChannel.emit('myevent', { name: 'tom' })
      }
    })

  }

})

被页面 .js 文件

Page({

  onLoad () {

    // 通过 this.getOpenerEventChannel() 可以获取 EventChannel 对象
    const EventChannel = this.getOpenerEventChannel()

    // 通过 EventChannel 提供的 on 方法监听页面发射的自定义事件
    EventChannel.on('myevent', (res) => {
      console.log(res)
    })

    // 通过 EventChannel 提供的 emit 方法也可以向上一级页面传递数据
    // 需要使用 emit 定义自定义事件,携带需要传递的数据
    EventChannel.emit('currentevent', { age: 10 })

  }

})

自定义导航栏

小程序默认的导航栏与 APP 一样都位于顶部固定位置。但是默认导航栏可能会影响小程序整体风格,且无法满足特定的设计需求,这时候,就需要进行自定义导航栏。

在 app.json 或者 page.json 中,配置 navigationStyle 属性为 custom,即可 自定义导航栏

在设置以后,就会移除默认的导航栏,只保留右上角胶囊按钮

落地代码:

{
  "usingComponents": {},
  "navigationStyle": "custom"
}
<!--pages/cate/cate.wxml-->
<!-- <text>pages/cate/cate.wxml</text> -->

<swiper class="custom-swiper" indicator-dots autoplay interval="2000">
  <swiper-item>
    <image src="../../assets/banner/banner-1.png" mode=""/>
  </swiper-item>

  <swiper-item>
    <image src="../../assets/banner/banner-2.png" mode=""/>
  </swiper-item>

  <swiper-item>
    <image src="../../assets/banner/banner-3.png" mode=""/>
  </swiper-item>
</swiper>
/* pages/cate/cate.wxss */

.custom-swiper {
  height: 440rpx;
}

.custom-swiper image {
  height: 100%;
  width: 100%;
}

### 微信小程序 `getApp` 函数使用说明及常见问题 #### 1. `getApp()` 基本概念 `getApp()` 是微信小程序框架提供的一种方法,用于获取当前应用的实例。该实例包含了全局的数据和方法,可以被多个页面或组件共享[^2]。 调用方式如下所示: ```javascript const appInstance = getApp(); console.log(appInstance.globalData); // 访问全局数据 ``` #### 2. 获取 App 实例的具体场景 当需要访问全局配置或者在不同页面之间传递数据时,可以通过 `getApp()` 方法来实现。例如,在某个页面中设置全局 token 并供其他页面读取: ```javascript // 在某页面中设置全局 token Page({ login() { const appInstance = getApp(); appInstance.globalData.token = 'your_token_here'; console.log('Token has been set:', appInstance.globalData.token); } }); ``` 如果尝试在一个尚未初始化完成的小程序环境中调用 `getApp()`,可能会遇到错误提示 “cannot find module ‘app’”。这是因为此时小程序还未完全加载完毕[^3]。 #### 3. 解决未找到 `getApp()` 的问题 为了防止因小程序启动顺序而导致无法正确获取到 App 实例的情况发生,建议始终将 `getApp()` 调用放置于异步上下文中执行。比如可以在页面 onLoad 生命周期之后再进行操作: ```javascript Page({ data: {}, onLoad(options) { setTimeout(() => { try { const appInstance = getApp(); if (appInstance && typeof appInstance === 'object') { this.setData({ globalData: appInstance.globalData }); } else { throw new Error('Failed to get app instance'); } } catch(e){ console.error('Error occurred while getting app instance', e.message); } }, 0); }, }); ``` 另外需要注意的是,不要直接导出整个 Application 对象给外部模块使用,而应该仅暴露必要的接口出来以减少耦合度[^1]。 #### 4. 小结 综上所述,合理运用 `getApp()` 可以为我们带来诸多便利之处,但同时也需注意其潜在风险以及如何规避这些问题的方法论探讨[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值