鸿蒙中 Navigation跳转页面时参数传递
摘要: 鸿蒙开发中,Navigation组件通过路由表配置实现页面跳转与参数传递。传递参数时需在pushPathByName中设置param对象,目标页面通过getParamByName获取参数,推荐在onReady或onNewParam回调中处理。返回参数使用pop()携带数据,源页面需预置onPop回调接收。注意事项包括:参数需可序列化(不支持函数/系统对象)、单实例页面需自行管理参数状态,且

鸿蒙(HarmonyOS)开发中,使用 Navigation组件进行页面跳转时,参数传递是实现页面间数据交互的核心环节。下面将从前置条件、传递参数、接收参数、返回参数以及注意事项等方面,梳理整个过程。
1. 前置条件与基本配置
在使用 Navigation 进行跳转前,必须完成以下基础配置:
- 创建并绑定导航栈:需要实例化一个
NavPathStack对象,并将其绑定到Navigation组件。 - 配置路由映射表:在项目的
resources/base/profile/目录下创建router_map.json文件,注册所有目标页面(包括页面名称、文件路径和构建函数名)。 - 在 module.json5 中声明:在
module.json5文件的"routerMap": "$profile:router_map"字段中关联路由表。 - 规范目标页面结构:目标页面的根组件必须是
NavDestination,并且需要使用@Builder装饰器导出一个构建函数,其名称必须与路由表中配置的buildFunction完全一致。
2. 跳转时传递参数
在跳转时,可以通过 pushPath、pushPathByName等方法传递参数。参数通过 param属性传递,其值可以是任意对象(但需注意序列化限制)。
以下示例使用 pushPathByName传递参数对象:
interface paramType {
param: string
}
let paramA: paramType = {
param: 'test1'
}
// 在跳转事件中传递参数
this.pathInfos.pushPathByName('MyFirstNavDestination', paramA);
3. 在目标页面接收参数
在目标页面中,可以通过 NavPathStack的 getParamByName方法获取传递过来的参数。为了确保参数已准备就绪,推荐在 NavDestination的 onReady生命周期回调中处理参数。对于 API version 9 及以上版本,如果同时实现了 onReady和 onNewParam,系统会优先触发 onNewParam回调。
获取参数的示例代码:
@Component
export struct MyFirstNavDestination {
@Consume('pathInfos') pathInfos: NavPathStack;
getParamsPrint() {
// 通过页面名称获取参数
console.info('param is ' + JSON.stringify(this.pathInfos.getParamByName('MyFirstNavDestination')));
}
build() {
NavDestination() {
// 页面内容
}
.onShown(() => {
this.getParamsPrint(); // 在页面显示时打印参数
})
}
}
说明:
onReady()更早触发:在 NavDestination中,onReady()在页面首次构建完成、即将首次显示前调用,此时页面可能还未对用户可见。在组件生命周期中通常只触发一次(除非组件被销毁后重新创建)。
onShown()稍晚触发:在页面真正对用户可见之后。每次页面从隐藏变为可见时都会触发。
4. 返回时传递参数
当从当前页面返回上一个页面时,可以通过 pop()方法携带参数返回。上一个页面需要在跳转时(例如调用 pushPath)预先设置 onPop回调函数来接收返回的结果。
返回参数的页面(例如第二个页面):
@Component
export struct MySecondNavDestination {
@Consume('pathInfos') pathInfos: NavPathStack;
private routerParams: paramType = { param: 'test 2' };
build() {
NavDestination() {
// 页面内容
}
.onBackPressed(() => {
this.pathInfos.pop(this.routerParams); // 返回时携带参数
return true;
})
}
}
接收返回参数的页面(例如第一个页面)在跳转时设置 onPop回调:
this.pathInfos.pushPath({
name: 'MySecondNavDestination',
param: null,
onPop: (popInfo: PopInfo) => {
// 接收从 MySecondNavDestination 返回的参数
console.info(`last page is: ${popInfo.info.name}, result: ${JSON.stringify(popInfo.result)}`);
}
});
备注:自API15起,推荐使用onResult处理返回场景的路由参数。
5. 注意事项
- 参数类型限制:
Navigation的param参数在传递过程中会经过序列化,因此不支持传递函数、方法、系统返回的对象(如HashMap、List)。如果需要传递复杂对象或实现回调,建议使用EventHub等事件通信机制。 - 单实例页面参数管理:对于单实例跳转场景(即同一个页面实例被多次复用),在 API 18 及以下版本需要自行管理参数,确保每次显示时能获取到正确的数据。
- 跳转拦截与中间页面回调:使用
popToName直接跳转到栈中某个页面时,中间被跳过的页面(例如从 D 直接返回到 A)不会触发其onPop回调,设计时需注意数据清理或保存逻辑。 - 路由表与预览器:使用系统路由表(
router_map.json)时,在 DevEco Studio 的预览器上可能无法正常跳转(出现白屏),建议在真机或模拟器上进行调试。
更多推荐

所有评论(0)