要不是看AI写的代码,我竟还不知道微信小程序居然有这么优雅的页面间传参的方法

56 阅读3分钟

要不是看AI写的代码,我竟还不知道微信小程序居然有这么优雅的页面间传参的方法

最近在给我的工作室的一个网球微信小程序(亮拍)增加一个记账的功能,方便网球场地方进行记账。我就想着使用腾讯的AI开发助手CodeBuddy开帮我初始化一些页面。有一说一,这个免费的AI开发助手还是挺强的,能按照我的需求,把多个页面开发设计出来了,并且UI还做得有点可以。尽管做出来的页面有些许问题,比如使用的uniap的组件时候不帮我修改主题色,页面有些逻辑没有帮我完成等等,不过已经帮我提升了非常高的效率了。按以往的速度,这四五个页面至少要花个三天左右的开发时间,而使用AI开发助手,则只需要一天都不到,就能把四五个页面都开发完,我只需要检查并修改问题即可。

回到正题,在AI开发助手帮我开发新增记账的页面时,这个页面我们设计的时候需要选择一个分组,用于控制这个账单的查看权限,然后会有一个分组的选择组件。但我看AI帮我生成的一个分组选择的页面,我就很好奇,两个页面间是怎么传递选择的分组的信息的?不看不知道,原来微信小程序早就提供了页面间传复杂参数的优雅方法。只不过文档写的很少,因此用的人非常少。

屏幕截图 2025-06-09 184035.png

在介绍新方法之前,在页面中传值的方法是这样的:

  1. 首先通过query从页面A传到页面B
  2. 等页面B操作完成之后,在通过全局的getApp().globalData来传递回页面A
  3. 等到操作完成之后,还需要对全局变量进行清理,否则会带来内存泄漏风险以及全局变量污染问题。

这种方法涉及到全局的变量,非常地不优雅。

下面我们来介绍一种更加优雅的页面间传递参数的方法:

假设我们有一个表单填写页面A,表单填写页面有一个分组选择的表单项,点击会跳转到一个分组选择页面B。那么页面A的跳转逻辑应该这样写:


{ 
    // ...
    methods:{
        // 显示分组选择
        showGroupPicker() {
            wx.navigateTo({
                url: '/pages/views/B',
                events: {
                    // 监听分组选择结果
                    onGroupSelected: (group) => {
                        this.form.groupId = group.id
                        this.selectedGroupName = group.name
                    },
                },
                success: (res) => {
                    res.eventChannel.emit('acceptDataFromOpenerPage', this.form.groupId)
                },
           })
        },
    }
    // ...
}

而在分组选择页面B中,要先接收初始的值,在选中分组后还需要把值传回到上一个页面A:

{
    // ...
    onLoad(){
         const eventChannel = this.getOpenerEventChannel()
        // 监听acceptDataFromOpenerPage事件,获取初始值
        eventChannel.on('acceptDataFromOpenerPage', (groupId ) => {
            let selectedGroup = null
            this.groups.forEach(group=>{
                if(group.id == groupId){
                    selectedGroup = group
                    throw new Error('break')
                }
            })
            this.selectedGroup = selectedGroup
        })
    },
    methods:{
        // 点击分组
        handleGroupClick(group) {
            const eventChannel = this.getOpenerEventChannel()
            eventChannel.emit('onGroupSelected', group)
            uni.navigateBack()
        },
        // ...
    }
    // ...
}

这里的主角就是EventChannel,wx.navigateTo的events和success参数,以及this.getOpenerEventChannel()三个接口。

我们可以看到,新方法并没有使用到额外的全局变量,减少了全局变量的清理工作,而且还能传递复杂的对象,不可谓不优雅。这个新方法非常值得大家去使用。