页面间的通信在各种项目中都是很常见的功能,在小程序中如何在不同页面中使用组件间通信,
其实很简单,懒得看我叨叨的可以直接查看 🔗 官方的DEMO
首先我们需要通过 wx.navigateTo
打开下一个页面,然后看你需要做怎么样的功能,
如果是想下一个页面传递数据,那么简单的几个参数你可以
query
的形式拼接在url
上,
然后在 被打开的页面中 的onLoad
中接受option
中接收query
数据如果需要传递复杂的数据,那么可以在
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.navigateTo
的success
回调中也包含一个EventChannel
对象。这两个
EventChannel
对象间可以使用emit
和on
方法相互发送、监听事件。
并且被打开的页面中 this.getOpenerEventChannel()
方法,可以在 生命周期 中使用,也可以在 自定义函数 中使用,并不是一定要在生命周期中使用这个方法。
P.S. 如果不是通过 wx.navigateTo
打开的页面是是没办法和上级页面通信的,这个需要稍微注意一下,比如说在开发过程中,直接编译了当前页,而不是从上级页面进入会报错。
文档
Page(Object object) #页面间通信 | 微信开放文档
wx.navigateTo(Object object) | 微信开放文档