场景:在开发小程序中,会出现这样一个场景:当前页面(监听者)打开并监听被打开页面(被监听者),被打开页面(被监听者)发生发送监听的数据到当前页面(监听者),具体实现如下:
注:写的时候是用Taro + react开发的小程序,可以把wx.换成Taro.
当前页面(监听者)
// html代码
// 点击的时候调整到被打开页面(被监听者)
<View onClick={this.goToMonitor}>
// js代码
goToMonitor = () => {
// 获取当前用户设置
wx.getSetting({
success: (res) => {
if (!res.authSetting["scope.userLocation"]) {
// 调起客户端小程序设置页面。返回用户设置的操作结果
wx.openSetting({
success(res) {
console.log(res.authSetting);
},
});
} else {
wx.navigateTo({
url: `XXXX`, // 被打开页面(被监听者)的页面地址
events: {
// 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
getRegion: (data) => {
this.setState(
{
// data就是被监听到的数据,可以在this.setState里面保存到当前页面(监听者)
},
this.xxxx(函数名) // 当拿到被监听到的数据,想里面操作其,可以在这写一个函数,看具体需求,可写可不写
);
},
},
});
}
},
});
};
被打开页面(被监听者)
// html代码
// 在被打开页面(被监听页面)触发要监听的数据的改变
<View onClick={this.handleMonitor}>
// js代码
// handleMonitor这个方法就是处理被打开页面(被监听者)的数据
// info就是触发handleMonitor传过来的型参
handleMonitor = (info) => {
const { callback = "getRegion" } = this.$router.params;
// 保存到上个界面
// wx.getCurrentPage这个方法用来获取当前页面栈,数组第一个元素为首页,最后一个元素为当前页面
const pages = wx.getCurrentPages();
const prevPage = pages[pages.length - 2];
const cb = prevPage.$component[callback];
cb && cb(info);
// Taro3只需要写下面👇的,上面的不需要写
this.eventChannel && this.eventChannel.emit("getRegion", { info });
// 返回到当前页面(监听者)
wx.navigateBack();
};