小程序路由跳转---事件通信通道EventChannel(二)

事件通信通道EventChannel实现两个页面之间的数据传输已在上篇小程序路由跳转—事件通信通道EventChannel(一)展开叙述,接下来讨论下多个页面(三个及以上)数据的通道如何构建。

本文重点:三个以上页面需将事件通信通道保存在一个公共可访问的实例中,比如app全局实例。

以下示例以三个页面为例
A页面

 onLoad: function () {
    wx.navigateTo({
      url: 'B?id=1',
      // events: 注册将在目标页面触发(派发)的同名事件的监听器
      events: {
        // 定义A页面和B页面之间的通道事件
        PageAacceptDataFromPageB: function (data) {
          console.log('B页面返回给页面A的数据', data)
        },
        // 定义A页面和C页面之间的通道事件
        PageAacceptDataFromPageC: function (data) {
          console.log('页面A收到C页面数据', data)
        }
      },
      success: function (res) {
        console.log(res.eventChannel)
        // 通过eventChannel向被打开页面传送数据
        res.eventChannel.emit('PageAacceptDataFromPageB', { data: 'page A->B' })
      }
    })
  },

B页面

 onLoad: function (option) {
    //注意this.getOpenerEventChannel() 只能在navigateTo模板页面使用,其他更多页面使用时,
    //可以保存在getApp()全局实例中以备其他页面使用
    // 保留AB通道事件,已备C页面给A页面发送数据
    const eventChannel = this.getOpenerEventChannel()

    // 保留AB通道事件,已备C页面给A页面发送数据
    getApp().pageBeventChannel = eventChannel
    // 监听PageAacceptDataFromPageB事件,获取上一页面通过eventChannel传送到当前页面的数据
    eventChannel.on('PageAacceptDataFromPageB', function (data) {
      console.log('页面B收到来自页面A的数据', data)
    })
    eventChannel.emit('PageAacceptDataFromPageB', { data: 'page B->A' });
    
    wx.navigateTo({
      url: 'C?id=1',
      events: {
        // 定义B页面和C页面之间的通道事件
        PageBacceptDataFromPageC: function (data) {
          console.log('C页面返回给页面B的数据', data)
        }
      },
      success: function (res) {
        // 通过eventChannel向被打开页面传送数据
        res.eventChannel.emit('PageBacceptDataFromPageC', { data: 'page B->C' })
      }
    })
  },

C页面

  onLoad: function (option) {
    const eventChannel = this.getOpenerEventChannel()
    // 监听PageBacceptDataFromPageC事件,获取上一页面通过eventChannel传送到当前页面的数据
    eventChannel.on('PageBacceptDataFromPageC', function (data) {
      console.log('页面C收到来自页面B的数据', data)
    })
    eventChannel.emit('PageBacceptDataFromPageC', { data: 'Page C->B' });
    
    // 使用AB通道的PageAacceptDataFromPageC事件给A发送数据
    const pageBeventChannel = getApp().pageBeventChannel
    pageBeventChannel.emit('PageAacceptDataFromPageC', { data: 'Page C->A' });
  },

运行结果

至此小程序路由跳转—事件通信通道EventChannel就告一段落,欢迎各位小伙伴积极互动。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想在路由跳转时更新El-Menu的选中状态,可以在路由导航后,手动设置El-Menu的当前选中项。 具体实现方法如下: 1. 在路由导航守卫中监听路由变化,获取当前路由路径。 ```javascript router.beforeEach((to, from, next) => { const currentPath = to.path; // 获取当前路由路径 // ... next(); }) ``` 2. 在El-Menu中设置`default-active`属性为当前路由路径。 ```html <template> <el-menu :default-active="currentPath" class="el-menu-demo" mode="horizontal" @select="handleSelect" > <el-menu-item index="/home">首页</el-menu-item> <el-menu-item index="/about">关于我们</el-menu-item> <el-menu-item index="/contact">联系我们</el-menu-item> </el-menu> </template> ``` 3. 在`handleSelect`方法中,将当前选中项保存到Vuex或本地存储中,以便下次渲染时恢复选中状态。 ```javascript methods: { handleSelect(index, indexPath) { this.$store.commit('setCurrentMenu', index); // 将当前选中项保存到Vuex localStorage.setItem('currentMenu', index); // 将当前选中项保存到本地存储 } } ``` 4. 在组件创建时,从Vuex或本地存储中获取当前选中项,并设置给El-Menu。 ```javascript created() { const currentMenu = this.$store.state.currentMenu || localStorage.getItem('currentMenu'); // 从Vuex或本地存储中获取当前选中项 if (currentMenu) { this.currentPath = currentMenu; // 将当前选中项设置给El-Menu } } ``` 通过以上步骤,就可以实现路由跳转时更新El-Menu的选中状态了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值