微信小程序路由及 `EventChannel` 通信

不同路由跳转的描述及场景,页面之间的 EventChannel 的使用。

路由

wx.switchTab
js 复制代码
// 描述 - 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
// 场景 - 跳转到 tabBar 页面
wx.switchTab({
    // 路径后不能带参数。
    url: '/pages/home/index',
    success: function () {},
    fail: function () {},
    complete: function () {},
})
wx.reLaunch
js 复制代码
// 描述 - 关闭所有页面,打开到应用内的某个页面
// 场景 - 跳转到任意页面,并关闭其他所有页面,跳转后不想让回退的场景可以用这个
wx.reLaunch({
    // 路径后可以带参数
    url: '/pages/home/index?key=value&key2=value2',
    success: function () {},
    fail: function () {},
    complete: function () {},
})
wx.redirectTo
js 复制代码
// 描述 - 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。
// 场景 - 跳转之后不希望当前页面保留到页面栈,在后续页面使用 navigateBack 不能返回当前页
wx.redirectTo({
    // 路径后可以带参数
    url: '/pages/home/index?key=value&key2=value2',
    success: function () {},
    fail: function () {},
    complete: function () {},
})
wx.navigateTo
js 复制代码
// 描述 - 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层。
// 场景 - 跳转到非 tabbar 页面
wx.navigateTo({
    // 路径后可以带参数
    url: '/pages/home/index?key=value&key2=value2',
    events: {}, // 页面间通信接口,用于监听被打开页面发送到当前页面的数据。
    success: function () {},
    fail: function () {},
    complete: function () {},
})
wx.navigateBack
js 复制代码
// 描述 - 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。
// 场景 - 返回到上一页面或多级页面
wx.navigateBack({
    delta: 1, // 返回的页面数,如果 delta 大于现有页面数,则返回到页面栈中只剩一个页面为止。
    success: function () {},
    fail: function () {},
    complete: function () {},
})

EventChannel

微信小程序的 EventChannel 是一种在通过 wx.navigateTo 打开的页面间进行事件通信的机制。它允许页面之间相互发送和监听事件,特别适合需要从后一个页面(Page B)向前一个页面(Page A)回传数据的场景,例如:订单页跳转到评论页,评论完成后通知订单页刷新。

Page A

js 复制代码
Page({
    methods: {
        toComment() {
            wx.navigateTo({
                url: '/pages/pageB/pageB', // 跳转到 Page B
                events: {
                    // 评论完成
                    'afterComment': function(data) {
                        console.log('接收到来自 Page B 的数据:', data);
                    },
                    // 可以同时监听多个事件
                    'anotherEvent': function(data) {
                        console.log('另一个事件的数据:', data);
                    }
                },
                success: function (res) {
                    // 页面跳转成功后,通过 eventChannel 向 Page B 发送数据
                    // 这个场景一般适用传输数据量比较大的时候
                    res.eventChannel.emit('eventFromA', { data: '这是从 A 页面发送的数据' });
                }
            });
        }
    }
})

Page B

js 复制代码
Page({
    onLoad(options) {
        // options - 一般是路由路径携带的参数,适合少量关键数据,有长度限制
        console.log('options', options);
        // 获取 EventChannel 实例
        const eventChannel = this.getOpenerEventChannel();
        
        // 监听 Page A 通过 success 回调发出的事件,例如 'eventFromA'
        eventChannel.on('eventFromA', (data) => {
            console.log('在 Page B 接收到来自 Page A 的数据:', data);
        });

        // 如果需要只监听一次,可以使用 once
        eventChannel.once('oneTimeEvent', (data) => {
            console.log('这个监听器只触发一次', data);
        });
    },
    methods: {
        // 评论后操作
        afterComment() {
            wx.navigateBack();
            const eventChannel = this.getOpenerEventChannel();
            eventChannel.emit('afterComment', { data: '这是从 B 页面发送的数据' });
        }
    }
})
  • 确保前后页面约定的事件名称一致,避免因事件名错误导致通信失败。
  • 对于长期不使用的监听器,及时使用 off 方法移除,以防止潜在的内存泄漏。
相关推荐
00后程序员张1 小时前
怎么在 iOS 上架 App,从构建端到审核端的全流程协作解析
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_915918411 小时前
iOS 开发者工具全景指南,构建高效开发、调试与性能优化的多工具工作体系
android·ios·性能优化·小程序·uni-app·iphone·webview
多看书少吃饭14 小时前
小程序支持HTTP POST 流式接口吗?
网络协议·http·小程序
询问QQ:48773927817 小时前
CDB文件第0x2C位置存放温度阈值
小程序
vx_vxbs6617 小时前
【SSM高校普法系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
android·java·python·mysql·小程序·php·idea
吹水一流18 小时前
微信小程序页面栈:从一个 Bug 讲到彻底搞懂
前端·微信小程序
duansamve21 小时前
支付宝小程序开发工具中如何模拟给页面传参?
小程序·支付宝小程序
低代码布道师1 天前
医疗预约小程序原型设计
低代码·小程序
星光一影1 天前
同城派送系统源码,支持小程序,h5,app
mysql·小程序·php·uniapp