鸿蒙ArkUI中路由跳转的几种方式及其区别

420 阅读3分钟

在鸿蒙ArkUI中,路由跳转是实现页面导航的核心功能,主要通过Router模块提供的API实现。以下是常见的几种跳转方式及其区别:


一、基础跳转方式

  1. router.pushUrl()

    • 功能:将目标页面压入页面栈顶,保留当前页面状态。用户可通过返回键或router.back()返回到原页面。

    • 适用场景:需要保留当前页面的导航场景(如从列表页跳转到详情页后需返回)。

    • 代码示例

      typescript
      复制
      router.pushUrl({ url: 'pages/DetailPage', params: { id: 1 } });
      
    • 特点:支持参数传递,页面栈中可存在多个相同URL的实例(默认Standard模式)3

  2. router.replaceUrl()

    • 功能:用目标页面替换当前页面,销毁原页面,无法通过返回键返回。

    • 适用场景:无需返回的页面切换(如登录成功后跳转主页)。

    • 代码示例

      typescript
      复制
      router.replaceUrl({ url: 'pages/HomePage' });
      
    • 特点:释放当前页面资源,页面栈中仅保留目标页面3


二、实例模式的区别

ArkUI路由支持两种实例模式,通过mode参数控制:

  1. Standard(多实例模式)

    • 默认模式,每次跳转都会在页面栈顶新增一个实例,即使URL相同。

    • 示例

      typescript
      复制
      router.pushUrl({ url: 'pages/DetailPage', mode: router.RouterMode.Standard });
      
  2. 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
    }
    

    注意:Router模块通过深拷贝传递参数,而Navigation组件通过引用传递,性能更优1 3


四、与Navigation组件的对比

虽然Router是常用方案,但Navigation组件在复杂场景中更具优势:

对比维度RouterNavigation
页面栈管理需手动维护跳转逻辑自动管理页面栈,支持NavPathStack操作
参数传递性能深拷贝(性能较低)引用传递(性能更优)
动效与布局控制受限(Page对象不暴露)支持自定义复杂动效和页面属性
多设备适配不支持一多能力原生支持一多(一次开发多端部署)

建议:简单跳转用Router,复杂页面栈或需自定义动效时用Navigation1 7


五、其他跳扩展方式

  1. 通过AbilitySlice跳转
    使用start方法启动新Ability,适用于跨模块或独立功能页面。

    typescript
    复制
    AbilitySlice.start(new Intent(DetailPage.class));
    

    注意:此方式会在任务视图中创建新任务2 5

  2. 自定义弹窗中的跳转
    CustomDialog中可直接调用路由API,实现弹窗关闭后自动跳转:

    typescript
    复制
    Button('确认').onClick(() => {
      this.controller.close();
      router.pushUrl({ url: 'pages/NextPage' });
    });
    

    适用场景:弹窗交互后无缝跳转4


总结

跳转方式核心区别适用场景
pushUrl保留原页面,可返回需回溯的导航(如详情页)
replaceUrl替换原页面,不可返回单向流程(如登录→主页)
Single模式复用已有页面实例避免重复打开同一功能页
Navigation组件支持复杂动效和一多能力多端适配或自定义UI的场景

开发者需根据页面栈管理需求、性能优化及动效复杂度选择合适的跳转方案。

官方链接:设置页面路由和组件导航