前情
最近在做小程式專案,選用是當前比較火的uniapp技術棧,經常會遇到頁面間訊息傳遞的需求。
為什麼要這麼做?
uniapp頁面間資料通訊方式有很多:透過url傳參,狀態管理庫vuex/pinia,本地儲存,事件通道eventChannel,EventBus等。
這次的需求是在A麵點選一個按鈕跳轉到B頁面拾取一個資料選項再返回A頁面用B頁面拾取的資料做接下來邏輯處理,前面文章我有介紹透過EventBus來做這種資料傳遞,今天介紹透過uni.navigateTo的events引數和this.getOpenerEventChannel()來實現父子頁面雙向通訊。
實現程式碼
A頁面
<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頁面
<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)