在鸿蒙ArkUI中,路由跳转是实现页面导航的核心功能,主要通过Router模块提供的API实现。以下是常见的几种跳转方式及其区别:
一、基础跳转方式
-
router.pushUrl()-
功能:将目标页面压入页面栈顶,保留当前页面状态。用户可通过返回键或
router.back()返回到原页面。 -
适用场景:需要保留当前页面的导航场景(如从列表页跳转到详情页后需返回)。
-
代码示例:
typescript 复制 router.pushUrl({ url: 'pages/DetailPage', params: { id: 1 } }); -
特点:支持参数传递,页面栈中可存在多个相同URL的实例(默认Standard模式)3。
-
-
router.replaceUrl()-
功能:用目标页面替换当前页面,销毁原页面,无法通过返回键返回。
-
适用场景:无需返回的页面切换(如登录成功后跳转主页)。
-
代码示例:
typescript 复制 router.replaceUrl({ url: 'pages/HomePage' }); -
特点:释放当前页面资源,页面栈中仅保留目标页面3。
-
二、实例模式的区别
ArkUI路由支持两种实例模式,通过mode参数控制:
-
Standard(多实例模式)
-
默认模式,每次跳转都会在页面栈顶新增一个实例,即使URL相同。
-
示例:
typescript 复制 router.pushUrl({ url: 'pages/DetailPage', mode: router.RouterMode.Standard });
-
-
Single(单实例模式)
-
若目标URL已在页面栈中存在,则复用最近的实例(将其移至栈顶),否则新建实例。
-
示例:
typescript 复制 router.pushUrl({ url: 'pages/DetailPage', mode: router.RouterMode.Single }); -
适用场景:避免重复打开同一页面(如购物车页面)3。
-
三、参数传递与接收
-
传递参数:通过
params字段传递对象,支持复杂数据类型。typescript 复制 router.pushUrl({ url: 'pages/DetailPage', params: { id: 1, name: 'Test' } }); -
接收参数:在目标页面的
onPageShow生命周期中获取:typescript 复制 onPageShow() { const params = router.getParams() as Record<string, string>; console.log(params.id); // 输出1 }
四、与Navigation组件的对比
虽然Router是常用方案,但Navigation组件在复杂场景中更具优势:
| 对比维度 | Router | Navigation |
|---|---|---|
| 页面栈管理 | 需手动维护跳转逻辑 | 自动管理页面栈,支持NavPathStack操作 |
| 参数传递性能 | 深拷贝(性能较低) | 引用传递(性能更优) |
| 动效与布局控制 | 受限(Page对象不暴露) | 支持自定义复杂动效和页面属性 |
| 多设备适配 | 不支持一多能力 | 原生支持一多(一次开发多端部署) |
建议:简单跳转用Router,复杂页面栈或需自定义动效时用Navigation1 7。
五、其他跳扩展方式
-
通过
AbilitySlice跳转:
使用start方法启动新Ability,适用于跨模块或独立功能页面。typescript 复制 AbilitySlice.start(new Intent(DetailPage.class)); -
自定义弹窗中的跳转:
在CustomDialog中可直接调用路由API,实现弹窗关闭后自动跳转:typescript 复制 Button('确认').onClick(() => { this.controller.close(); router.pushUrl({ url: 'pages/NextPage' }); });适用场景:弹窗交互后无缝跳转4。
总结
| 跳转方式 | 核心区别 | 适用场景 |
|---|---|---|
pushUrl | 保留原页面,可返回 | 需回溯的导航(如详情页) |
replaceUrl | 替换原页面,不可返回 | 单向流程(如登录→主页) |
Single模式 | 复用已有页面实例 | 避免重复打开同一功能页 |
Navigation组件 | 支持复杂动效和一多能力 | 多端适配或自定义UI的场景 |
开发者需根据页面栈管理需求、性能优化及动效复杂度选择合适的跳转方案。
官方链接:设置页面路由和组件导航