uniapp中通過eventChannel
實現頁面間通信的方法,這是一種官方推薦的高效傳參方式。我來解釋下這種方式的完整實現和注意事項:
- ?發送頁面(父頁面)?:
uni.navigateTo({url: '/pages/detail/detail',success: (res) => {// 通過eventChannel發送數據res.eventChannel.emit('sendData', {sTypeName: '詳情頁',sTypeCode: 'detail123'});} });
- ?接收頁面(子頁面)?:
onLoad(options) {const eventChannel = this.getOpenerEventChannel();eventChannel.on('sendData', (data) => {console.log('接收到的數據:', data);uni.setNavigationBarTitle({title: data.sTypeName});this.params = {type: data.sTypeCode};}); }
?關鍵點說明?:
eventChannel
是uniapp提供的頁面間通信機制- 數據是在頁面跳轉成功后通過
success
回調發送的 - 子頁面通過
getOpenerEventChannel()
獲取通信通道 - 這種方式適合傳遞復雜對象,沒有URL長度限制
?注意事項?:
- 確保子頁面已加載完成再發送數據(建議放在
onLoad
中接收) - 數據是實時傳遞的,不是持久化的
- 如果頁面是通過
redirectTo
跳轉的,則無法使用這種方式 - 建議對事件名使用常量定義,避免拼寫錯誤
在uniapp中通過URL傳遞參數主要有以下幾種方式:
- 基礎URL傳參方式(適合簡單參數):
直接在跳轉URL后拼接參數,格式為?key=value&key2=value2
uni.navigateTo({url: '/pages/detail/detail?id=123&name=test' });
- 接收參數方式:
在目標頁面的onLoad
生命周期函數中獲取onLoad(options) {console.log(options.id); // 輸出:123console.log(options.name); // 輸出:test }
- 傳遞對象參數(需要編碼):
const params = {id: 123,user: {name: '張三', age: 20} }; uni.navigateTo({url: '/pages/detail/detail?data=' + encodeURIComponent(JSON.stringify(params)) });
注意事項:
- URL長度有限制(不同瀏覽器不同,一般不超過2000字符)
- 傳遞對象時需要先JSON序列化再編碼
- 參數會顯示在地址欄中,敏感數據不建議用URL傳遞
- 獲取的參數都是字符串類型,需要自行轉換
對于復雜數據結構,建議使用eventChannel或Vuex等其它方式傳遞。
傳遞方式:?
1. ?全局變量(globalData)
// App.vue
App({globalData: {userInfo: null}
});// 頁面A
getApp().globalData.userInfo = { name: 'John' };
uni.navigateTo({ url: '/pages/B/B' });// 頁面B
onLoad() {const userInfo = getApp().globalData.userInfo;console.log(userInfo); // { name: 'John' }
}
2. ?Vuex狀態管理?
Vuex是Vue.js的官方狀態管理庫,適合管理復雜的全局狀態。通過定義state
、mutations
和actions
,可以在不同頁面中共享和修改數據?2 4。
// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);const store = new Vuex.Store({state: {sharedData: null},mutations: {updateSharedData(state, payload) {state.sharedData = payload;}}
});// 頁面A
this.$store.commit('updateSharedData', { key: 'value' });
uni.navigateTo({ url: '/pages/B/B' });// 頁面B
onLoad() {const data = this.$store.state.sharedData;console.log(data); // { key: 'value' }
}
3. ?本地存儲(Storage)?
使用uni.setStorageSync
和uni.getStorageSync
可以將數據存儲在本地,適合需要持久化的數據傳遞?1 2
// 頁面A
uni.setStorageSync('param1', 'value1');
uni.navigateTo({ url: '/pages/B/B' });// 頁面B
onLoad() {const param1 = uni.getStorageSync('param1');console.log(param1); // 'value1'
}
還有很多自行探索...