在鸿蒙应用开发中,路由传参是实现页面间通信的核心技术。路由合理设计传参机制对复杂应用的十分重要。在鸿蒙学习过程中,有多种路由方式可以使用,下面是有关路由传参的经验分享:
一、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%+ 的路由胶水代码,尤其适合跨团队协作的鸿蒙应用项目。