微信小程序学习日记 L07 eventChannel 页面事件通信通道

页面间的通信在各种项目中都是很常见的功能,在小程序中如何在不同页面中使用组件间通信,
其实很简单,懒得看我叨叨的可以直接查看 🔗 官方的DEMO

首先我们需要通过 wx.navigateTo 打开下一个页面,然后看你需要做怎么样的功能,

  1. 如果是想下一个页面传递数据,那么简单的几个参数你可以 query 的形式拼接在 url 上,
    然后在 被打开的页面中 的 onLoad 中接受 option 中接收 query 数据

  2. 如果需要传递复杂的数据,那么可以在 success 回调中执行 eventChannel.emit() 向打开的页面传递。
    然后在 被打开的页面中 的中使用 this.getOpenerEventChannel() 方法来获得一个 EventChannel 对象,通过该对象的 on 方法获取上一页面通过 eventChannel 传送到当前页面的数据

具体示例如下:

// Opener
wx.navigateTo({
  url: 'test?id=1', // 增加query参数
  success: function(e) {
    // 通过eventChannel向被打开页面传送数据 
    // 这个 acceptDataFromOpenerPage 事件名可以自定义
    e.eventChannel.emit('acceptDataFromOpenerPage', { data: 'test' })
  }
})
// Opened
Page({
  onLoad: function(option){
    console.log(option.query) // 接收上一级页面传递的query参数

    const eventChannel = this.getOpenerEventChannel()
    // 监听 Opener 页面 emit 的时间名称 "acceptDataFromOpenerPage" 事件,
    // 来获取上一页面通过eventChannel传送到当前页面的数据
    eventChannel.on('acceptDataFromOpenerPage', function(data) {
      console.log(data)
      // log => { data: 'text' }
    })
  }
})

如果想要从 被打开的页面(Opened) 向 上一页(Opener) 传递数据,和 接受 上一页 传递过来的参数 一样使用 this.getOpenerEventChannel() 方法来获得一个 EventChannel 对象,然后通过
emit 事件向上一页提交数据。
然后再上一页的 wx.navigateTo 方法中的 events 属性中添加一个监听器,获取被打开页面传送到当前页面的数据。

具体示例如下:

// Opener
wx.navigateTo({
  events: {
    // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
    acceptDataFromOpenedPage: function(data) {
      console.log(data)
      // log => { data: 'text' }
    },
    someEvent: function(data) {
      console.log(data)
      // log => { data: 'text' }
    }
    ...
  },
})
// Opened
Page({
  onLoad: function(){
    const eventChannel = this.getOpenerEventChannel()
    eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'});
    eventChannel.emit('someEvent', {data: 'test'});
  }
})

其实就那么简单

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

  • 被打开的页面可以通过 this.getOpenerEventChannel() 方法来获得一个 EventChannel 对象
  • wx.navigateTosuccess 回调中也包含一个 EventChannel 对象。

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

并且被打开的页面中 this.getOpenerEventChannel() 方法,可以在 生命周期 中使用,也可以在 自定义函数 中使用,并不是一定要在生命周期中使用这个方法。

P.S. 如果不是通过 wx.navigateTo 打开的页面是是没办法和上级页面通信的,这个需要稍微注意一下,比如说在开发过程中,直接编译了当前页,而不是从上级页面进入会报错。


文档

EventChannel | 微信开放文档

Page(Object object) #页面间通信 | 微信开放文档
wx.navigateTo(Object object) | 微信开放文档