微信小程序页面传值/eventChannel

6,754 阅读1分钟

常见传值方案

  1. url传参
假设数据由A传递到B
A:
//基本数据类型
wx.navigateTo({
  url: `/pages/detail/index?id=${id)}`
})
//引用型数据
wx.navigateTo({
  url: `/pages/detail/index?item=${JSON.stringify(item)}`
})

B:
onLoad: function (options) {
  const id = options.id;
  const item = JSON.parse(options.item)
}
  1. storage缓存

存在问题

  • 缓存先将数据存入存储,再到另外一个页面去读取,如果数据涉及到了多个页面,则可能会导致数据的紊乱。
  • 缓存和url能传递的参数都只能支持原生类型、Date、及能够通过JSON.stringify序列化的对象。

eventChannel

在 2019 年 7 月 2 日的小程序基础库版本更新 v2.7.3 中,小程序新增了一个页面间通讯的接口,帮助我们的小程序完成不同页面间数据同步的功能。

假设存在A和B两个页面,其中A是首页,B是详情页

A向B(首页向详情页)传递数据:

A:
const detail = item
wx.navigateTo({
  url: `/pages/detail/index?id=${id)}`,
  success: function(res) { 
    // 通过eventChannel向被打开页面传送数据 
    res.eventChannel.emit('getDetail', detail) 
  }
})
B:
onLoad: function (options) {
  const eventChannel = this.getOpenerEventChannel();   //取到事件对象
  eventChannel.on("getDetail", data => {//监听getDetail事件,获取A页面通过eventChannel传送到当前页面的数据
    ……
  });
},

B向A(详情页向首页)传递数据:

A:
wx.navigateTo({
  url: `/pages/detail/index?id=${id)}`,
  events: {
    // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
    acceptDataFromOpenedPage: function(data) {
      console.log(data)
    },
    someEvent: function(data) {
      console.log(data)
    }
    ...
  },
})
B:
onLoad: function(option){
  const eventChannel = this.getOpenerEventChannel();
  eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'}); 
  eventChannel.emit('someEvent', {data: 'test'});
}

微信官方文档 developers.weixin.qq.com/miniprogram…