代码背景:
使用uniapp进行微信小程序开发时,有a和b两个页面,从a进入b页面后,通过uni.navigateBack()方法返回a页面时候,无法触发a页面的onShow函数里面的接口调用。
解决思路
1.通过EventChannel方法进行页面通信。
因为使用的是vue3的方法,所以只贴vue3的源码
javascript
前往到test页面
uni.navigateTo({
url: '/pages/test?id=1',
events: {
// 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
acceptDataFromOpenedPage: function(data) {
console.log(data)
},
someEvent: function(data) {
console.log(data)
}
...
},
success: function(res) {
// 通过eventChannel向被打开页面传送数据
res.eventChannel.emit('acceptDataFromOpenerPage', { data: 'data from starter page' })
}
})
//在test页面进行接收
onMounted(() => {
const instance = getCurrentInstance().proxy
const eventChannel = instance.getOpenerEventChannel();
eventChannel.emit('acceptDataFromOpenedPage', {
data: 'data from test page'
});
eventChannel.emit('someEvent', {
data: 'data from test page for someEvent'
});
eventChannel.on('acceptDataFromOpenerPage', function(data) {
console.log('acceptDataFromOpenerPage', data)
})
})
//onShow onLoad方法都是一样的。
可能我暂时还未遇到此种场景。已经到了b页面,为什么还要去把b页面的值传输给a页面呢,不是很理解。但是把a页面的值传入到b页面,还是很有用的。如果不使用navigateBack,选择redirectTo或者navigateTo方法都是可以进行通信,并且是重新触发show函数的。这样做有点复杂。
我们还是更想使用navigateBack进行触发回调处理。
注意:注意:注意:
getOpenerEventChannel 只能在非首页和通过 uni.navigateTo 或 uni.redirectTo 打开的页面中使用。如果你是在首页或其他不支持的场景中使用,它将不可用。
2.通过uni. $ on 和 uni. $ emit的方法的方法进行传值和触发函数
首先在b页面进行$emit的数据传递,在调用navigateBack方法之前,进行 $emit方法
javascript
uni.$emit('refreshData', state.info);
uni.navigateBack();
在a页面的onLoad函数内进行$on的接收
javascript
uni.$on('refreshData', (val) => {
console.log(val);
//可以获取b页面的数据
//也可以进行a页面接口的重新触发
loadData();
})
这样就可以解决使用navigateBack返回到上一个页面时候,接口未刷新的问题。