小程序两个页面之间的通信方法

小程序两个页面之间的通信方法

image

几日前,不知道为什么小程序的开发者工具为什么罢工了提示,不提示页面跳转的方法名了,只好打开小程序的官方文档界面。复制方法名“navigateTo”的时候,多看了一眼,不知道什么时候更新的一个属性,然后搜索了一下。2.7.3的基础库,居然是2019年的,我浏览了无数次被我忽略过了。

Table

events

页面间通信接口,用于监听被打开页面发送到当前页面的数据。基础库 2.7.3 开始支持。

既然他可以通讯,那其它的几个页面跳转方法呢,是不是也可以通信。

很严谨,其它的页面使用的描述词都是“关闭当前页面”或者“关闭所有页面”

只有“navigateTo”用的是“保留当前页面,跳转到应用内的某个页面。”

所以只有“navigateTo”可以用这个页面之间的通信

使用方法呢,其实官方的示例就挺清楚的了。

页面A:

wx.navigateTo({
  url: 'test?id=1',
  events: {
    // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
    acceptDataFromOpenedPage: function(data) {
      console.log(data)
    },
    someEvent: function(data) {
      console.log(data)
    }
    ...
  },
  success: function(res) {
    // 通过eventChannel向被打开页面传送数据
    res.eventChannel.emit('acceptDataFromOpenerPage', { data: 'test' })
  }
})

页面B:

Page({
  onLoad: function(option){
    console.log(option.query)
    const eventChannel = this.getOpenerEventChannel()
    eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'});
    eventChannel.emit('someEvent', {data: 'test'});
    // 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
    eventChannel.on('acceptDataFromOpenerPage', function(data) {
      console.log(data)
    })
  }
})

然后本着无聊,玄策红开先升一技能还是二技能,多少秒用一技能打红Buff最快的精神,把其它页面间通讯的方法也总结了一下。

image

第一个全局变量

也就是在globalData里面定义,简单、直接、所有页面都可以共享。

但数据量大的时候别用

App({
  globalData: {
    sharedData: ‘秋野的意’
  }
})

// 调用的时候
getApp().globalData.sharedData

第二个页面传参

常规的在url的地址后面拼接相应的参数,局限就是实现原理只能在页面跳转的时候用

当然数据量大的时候也别用

wx.navigateTo({
  url: '/pages/page/index?id=88888888'
})

// 调用的时候
onLoad: function(options) {
  console.log(options.id) // 
}

第三个本地存储

通过 wx.setStoragewx.getStorage 方法在本地存储数据。

好处是数据持久化,跨页面和跨会话的时候都行。

不过读写会相对慢一点点。

wx.setStorage({
  key: 'sharedData',
  data: '秋野的意'
})

// 调用的时候
wx.getStorage({
  key: 'sharedData',
  success: function(res) {
    console.log(res.data) 
  }
})

第四个事件总线(EventBus)

通过自定义事件总线实现页面之间的通信。

// 定义一个 EventBus 类,用于实现事件总线模式
class EventBus {
  // 构造函数,初始化事件存储对象
  constructor() {
    // 用于存储事件及其对应的监听器
    this.events = {}
  }

  // 注册事件监听器的方法
  on(event, listener) {
    // 如果该事件还没有监听器,则初始化一个空数组
    if (!this.events[event]) {
      this.events[event] = []
    }
    // 将监听器添加到事件的监听器数组中
    this.events[event].push(listener)
  }

  // 触发事件的方法
  emit(event, data) {
    // 如果该事件有监听器,则依次调用这些监听器
    if (this.events[event]) {
      // 遍历并调用每个监听器,传递数据
      this.events[event].forEach(listener => listener(data))
    }
  }
}

// 创建一个 EventBus 实例
const eventBus = new EventBus()
// 导出 EventBus 实例,以便在其他模块中使用
module.exports = eventBus



// 调用的页面
const eventBus = require('../../utils/eventBus')

// 监测和设置的方法
eventBus.emit('sharedData', '我是秋野')

eventBus.on('sharedData', (data) => {
  console.log(data) 
})