微信小程序路由及 `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 方法移除,以防止潜在的内存泄漏。
相关推荐
维双云15 小时前
社区生鲜小程序怎么做?4个经营环节。
小程序·零售
2601_9499506318 小时前
成绩提升不靠盲目刷题:用练题簿找准真正的薄弱知识点
学习·小程序·刷题·小程序推荐
今日热点19 小时前
微信小程序主体变更公证全流程实操解析:场景条件、材料规范、驳回避坑与Python校验脚本实现
python·微信小程序·小程序
Buke..19 小时前
【小程序逆向】某游快爆 AI 逆向 sign参数:AI 辅助分析与 MCP 工具链实战
前端·人工智能·爬虫·python·小程序·notepad++
T01156181 天前
艺培场馆课时预约小程序用户端 & 后台联动踩坑上篇(预约、课时、缓存、消息、学员端自身问题)
java·缓存·小程序·bug·全栈项目实战手记·艺培课时系统‘’
fthux1 天前
下一次提交,隔了八年:掘金小程序回来了
微信小程序·开源·github
维双云1 天前
宠物门店小程序怎么搭?从预约到复购的完整思路。
小程序·宠物
云云只是个程序马喽2 天前
短剧/推文/AI创作变现小程序完整落地方案:自研vs成熟系统成本对比+全流程实现指南
人工智能·小程序
ZiYiMing2 天前
miniprogram-automator 在 2026 年还能用吗?——官方 SDK 三处硬伤的排查与重建
微信小程序