uni-app上下级页面数据双向通信

前情

最近在做小程序项目,选用是当前比较火的uniapp技术栈,经常会遇到页面间消息传递的需求。

为什么要这么做?

uniapp页面间数据通信方式有很多:通过url传参,状态管理库vuex/pinia,本地存储,事件通道eventChannel,EventBus等。

这次的需求是在A面点击一个按钮跳转到B页面拾取一个数据选项再返回A页面用B页面拾取的数据做接下来逻辑处理,前面文章我有介绍通过EventBus来做这种数据传递,今天介绍通过uni.navigateTo的events参数和this.getOpenerEventChannel()来实现父子页面双向通信。

实现代码

A页面

jsx 复制代码
<template>
  <view>
    <text>我是A页面</text>
	  <button @click="gotoPageB">点我去B页面</button>
  </view>
</template>

<script>
export default {
  methods: {
      gotoPageB() {
          uni.navigateTo({
            url: '/pages/pageB/pageB',
            events: {
                    pageDataFormA:(event) => {
                        this.handleCustomEvent(event);
                    }
            },
            success: function(res) {
                // 通过eventChannel向被打开页面传送数据
                res.eventChannel.emit('dataFromB', { data: 'Hello from Component B'})
            }
        });
      },
    handleCustomEvent(event) {
        console.log(event.data); // 输出: Hello from Component B
      // 处理事件的业务逻辑
      // ...
    }
  }
};
</script>

B页面

jsx 复制代码
<template>
  <view>
    <text>我是B页面</text>
    <button @tap="triggerEvent">点我</button>
  </view>
</template>

<script>
export default {
  methods: {
    triggerEvent() {
      this.eventChannel.emit('pageDataFormA', { data: 'Hello from Component B' })
      uni.navigateBack();
    },
    handPageBdata(event) {
      console.log(event.data); // 输出: Hello from Component A
      // 处理事件的业务逻辑
      // ...
    }
  },
  onLoad(){
      this.eventChannel = this.getOpenerEventChannel();
      this.eventChannel.on('dataFromB', (event) => {
          this.handPageBdata(event);
      });
  }
};
</script>

实例演示:

思考

其实这种方式是特意为这种父子级页面做数据传递准备的,像eventBus的使用范围更更广,如果你也有这种父子级页面数据通信的要求,这种方式比EventBus更适合,你可以在项目中试一试,但是uni-app版本大于2.8.9的时候才可以使用,我写这篇文章的时候uniapp版本已到了4.15,兼容问题我感觉可以忽略,如实在担心有兼容那就还是用EventBus吧。

官方文挡的详细介绍:uni.navigateTo(OBJECT) | uni-app官网 (dcloud.net.cn)

相关推荐
小白菜学前端3 分钟前
vue2 常用内置指令总结
前端·vue.js
林_深时见鹿4 分钟前
Vue + ElementPlus 自定义指令控制输入框只可以输入数字
前端·javascript·vue.js
椒盐螺丝钉5 分钟前
Vue组件化开发介绍
前端·javascript·vue.js
koooo~7 分钟前
v-model与-sync的演变和融合
前端·javascript·vue.js
matlab的学徒12 分钟前
Web与Nginx网站服务(改)
linux·运维·前端·nginx·tomcat
从零开始学习人工智能1 小时前
快速搭建B/S架构HTML演示页:从工具选择到实战落地
前端·架构·html
虫虫rankourin1 小时前
在 create-react-app (CRA) 创建的应用中使用 react-router-dom v7以及懒加载的使用方法
前端·react.js
小刘鸭地下城1 小时前
Web安全必备:关键 HTTP 标头解析
前端
yddddddy2 小时前
html基本知识
前端·html
荣达2 小时前
koa洋葱模型理解
前端·后端·node.js