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

426 阅读2分钟

场景

  1. 我们在项目中会遇到从A页面跳转到B页面的操作
  2. 从A页面跳转B页面时需要携带一些B页面需要使用的参数
  3. 在B页面进行一些操作后需要返回到A页面,但是A页面又需要对从B页面返回回来后的行为进行一些操作,比如刷新数据之类的

A页面

这个没什么好说的,一般就是使用uni.navigateTo函数,但是由于我们需要对从B页面返回回来后的行为进行一些操作,所以我们需要多设置一些配置,如下

uni.navigateTo({
			url: `/page_user/orderDetail?id=${orderId}`,
			events: {
				goback(data) {
					console.log(data);
				},
			},
		});

可以看到,uni.navigateTo函数除了常用的url参数外,还使用了一个events参数,这个参数中的函数名就是B页面向A页面发送返回后需要进行什么操作的通信标识

uni.navigateTo函数除了可以在url参数中传入数据,也可以使用另一种方法传递数据,这样的好处是跳转的路由不会很长,并且由于url有长度限制,所以如果要传入

B页面

B页面首先需要在onLoad生命周期中接受A页面传入的参数

import { onLoad } from '@dcloudio/uni-app';
onLoad((res)=>{})

B页面使用uni.navigateBack函数返回上一页,但是我们由于需要通知A页面做一下操作,所以还需要一些额外操作,如下

import { getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const eventChannel = proxy.getOpenerEventChannel();

eventChannel.emit('goback', { backData: '你好,我是从B页面返回A页面时给A页面的数据' });
await new Promise((resolve) => setTimeout(resolve, 1500));
uni.navigateBack();

可以看出第四行代码就是B页面通知A页面的关健所在了,emit中第一个参数就是与A页面的通信标识,第二个参数是需要返回给A页面的数据

注意: 这个是vue3的写法,第一和第二行都是为了获取到当前页面的this,所以如果是vue2的话,可以省略第一和第二行的代码,并将第三行的proxy改为this即可

参考文章:uniapp.dcloud.net.cn/api/router.…