在鴻蒙應用開發中,路由傳參是實現頁面間通信的核心技術。路由合理設計傳參機制對複雜應用的十分重要。在鴻蒙學習過程中,有多種路由方式可以使用,下面是有關路由傳參的經驗分享:
一、router
核心技巧:
參數類型處理:支持string | number | boolean | object類型傳遞,對象需用JSON.stringify序列化
參數安全獲取:在目標頁面的onPageShow生命週期獲取參數,避免頁面未初始化時訪問
參數校驗:使用try-catch處理非法參數格式
URL管理:通過pages.json統一管理路由路徑,避免硬編碼
核心代碼示例(用户詳情頁跳轉):
// 用户列表頁 (傳遞參數)
import router from '@ohos.router';
@Entry
@Component
struct UserListPage {
private user = { id: 1001, name: '張三', vip: true };
build() {
List() {
ListItem() {
Text(this.user.name)
.onClick(() => {
// 跳轉並傳遞複雜對象
router.pushUrl({
url: 'pages/UserDetailPage',
params: {
userData: JSON.stringify(this.user), // 對象序列化
source: 'homePage'
}
})
})
}
}
}
}
// 用户詳情頁 (接收參數)
@Component
export struct UserDetailPage {
@State userId: number = 0;
@State userName: string = '';
@State isVip: boolean = false;
onPageShow() {
const params = router.getParams(); // 獲取路由參數
try {
if (params) {
const user = JSON.parse(params['userData'] as string); // 反序列化
this.userId = user.id;
this.userName = user.name;
this.isVip = user.vip;
console.log(`來源頁面: ${params.source}`);
}
} catch (error) {
console.error('參數解析錯誤', error);
}
}
build() {
Column() {
Text(`ID: ${this.userId}`).fontSize(18)
Text(`姓名: ${this.userName}`).fontColor(this.isVip ? Color.Red : Color.Black)
// ...
}
}
}
避坑指南:
大數據傳遞:超過1MB數據建議使用公共狀態管理(如AppStorage)替代路由傳參
敏感信息:切勿通過URL傳遞密碼等敏感數據
頁面回傳:使用router.back()返回時可攜帶結果參數:
router.back({
url: 'pages/UserListPage',
params: { updated: true }
})
動態路由:支持路徑參數pages/UserDetailPage/:id,通過router.getParams()['id']獲取
二、HMRouter
HMRouter是HarmonyOS上頁面跳轉的場景解決方案,主要解決應用內原生頁面間相互跳轉的問題。本文主要以實際開發中的各項場景為例,介紹HMRouter路由框架的使用。HMRouter路由框架提供了下列功能特性:
使用自定義註解實現路由跳轉。
支持HAR/HSP。
支持路由攔截、路由生命週期。
簡化自定義動畫配置:配置全局動畫,單獨指定某個頁面的切換動畫。
支持不同的頁面類型:單例頁面、Dialog頁面。
該框架底層對Navigation相關能力進行了封裝,幫助開發者減少對Navigation相關細節內容的關注、提高開發效率,同時該框架對頁面跳轉能力進行了增強,例如其中的路由攔截、單例頁面等。
頁面跳轉:
HMRouter提供了基於自定義註解的頁面跳轉與返回功能,使用步驟如下:
頁面跳轉
1.配置頁面路由
@HMRouter({ pageUrl: 'profile/Address' })
@Entry
@Component
export struct Address {
...
}
2.頁面跳轉
onClick(()=>{
...
HMRouterMgr.push({pageUrl:'profile/Address',animator:true})
})
頁面傳參
傳遞參數
.onClick(() => {
HMRouterMgr.push({pageUrl:'goods/Detail',param:item})
// -----
})
接收參數
@HMRouter({pageUrl:'goods/Detail'})
@ComponentV2
export struct GoodsDetail {
@Local item:HMPageParam=HMRouterMgr.getCurrentParam(HMParamType.all) as HMPageParam
@Provider() goods:GoodsItemType=this.item.data as GoodsItemType
...
}
適用場景建議
簡單應用:直接使用 HMRouter 的註解+攔截器,快速實現解耦跳轉。
大型項目:採用 TheRouter,通過 動態路由表 和 服務注入(ServiceProvider)解決模塊化協同問題84。
通過合理使用 HMRouter,可減少 30%+ 的路由膠水代碼,尤其適合跨團隊協作的鴻蒙應用項目。