微信小程序路由及 `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 方法移除,以防止潜在的内存泄漏。
相关推荐
微爱帮监所写信寄信25 分钟前
微爱帮监狱寄信写信小程序工单系统技术方案:智能投诉处理与问题解决平台
人工智能·网络协议·安全·小程序·内容审核·监狱寄信
GRsln1 小时前
解决微信小程序报“errno“:600001 ERR_CERT_AUTHORITY_INVALID问题
nginx·微信小程序·小程序·ssl
阿奇__1 小时前
配置扫普通二维码进入微信小程序体验版踩坑
微信小程序·小程序
毕设源码-邱学长1 小时前
【开题答辩全过程】以 基于微信小程序的知识问答服务系统为例,包含答辩的问题和答案
微信小程序·小程序
微爱帮监所写信寄信1 小时前
微爱帮监狱写信寄信小程序智慧天气关怀系统技术方案
网络协议·小程序·https·监狱寄信·微爱帮
2501_915921431 小时前
iPhone HTTPS 抓包在真机环境下面临的常见问题
android·ios·小程序·https·uni-app·iphone·webview
BBbila2 小时前
百度/微信小程序-跨端开发-兼容性避坑指南
微信小程序·小程序
草根站起来2 小时前
微信小程序request错误
微信小程序·小程序
毕设源码-邱学长2 小时前
【开题答辩全过程】以 公司打卡小程序为例,包含答辩的问题和答案
小程序
2501_915918412 小时前
iOS 图片资源保护方法,分析图片在二次打包和资源篡改中的实际风险
android·ios·小程序·https·uni-app·iphone·webview