HarmonyOS ArkTS 组件级导航(Navigation)详解

48 阅读4分钟

HarmonyOS ArkTS 组件级导航(Navigation)详解

鸿蒙第四期开发者活动

Navigation 是 HarmonyOS(ArkTS/ArkUI)应用中的页面导航容器组件。它负责管理界面之间的跳转、栈结构、显示模式、页面参数传递等导航行为,是构建多页面应用的官方推荐方式。华为开发者


一、什么是 Navigation?

在 HarmonyOS ArkTS 框架下,Navigation 是一个 UI 容器组件,承载应用的页面路由逻辑:

  • 作为根视图容器 在应用根组件(通常是主页面 @Entry 的组件中)使用。
  • 支持多种显示模式:Stack、Split、Auto。
  • 管理内部页面 的切换、过渡和返回行为。 华为开发者

简单来说,它类似于传统手机开发的“导航栈控制器”,只是内置为声明式 UI 的一等组件。 华为开发者


二、核心能力与职责

Navigation 主要负责三件事:

  1. 页面栈管理 每个 Navigation 内部都有一个页面栈,由框架自动维护,支持进栈、出栈、替换等操作。 博客园
  2. 多显示模式支持 适配不同屏幕尺寸和场景。 华为开发者
  3. 跨模块/跨包导航 Navigation 不受模块边界限制,可以在应用模块之间跳转。 华为开发者

三、三种显示模式(NavigationMode)

Navigation 组件可以根据设备特性自动调整 UI 布局,主要有三种模式:

模式说明适用场景
Stack单栏导航手机竖屏等传统 UI
Split双栏导航(左右分栏)大屏/平板/横屏设备
Auto自动适配 Stack 或 Split响应式布局(推荐)

推荐使用 Auto 模式在不同设备上实现响应式导航(自动在单栏与分栏之间切换)。 华为开发者


四、Navigation 与页面路由关系

在 ArkTS/ArkUI 中,Navigation 承担了类似于“路由控制器 + 页面容器”的角色:

  • Navigation 内嵌多个 NavDestination(页面目的地) 组件。
  • 每个 NavDestination 代表一个可导航的页面。
  • 页面之间的跳转由栈动作实现(push/pop/replace)。 华为开发者

简单结构示意:

 Navigation() {
   NavDestination({ name: "Home" }) { /* 主页面内容 */ }
   NavDestination({ name: "Detail" }) { /* 详情页内容 */ }
 }

内部实现上,Navigation 隐式维护一个 页面栈,当 push 一个目的地时,栈顶层 “当前可见”。 华为开发者


五、页面导航基本操作

1. Push(推入一个页面)

将新页面压入栈顶,使其显示:

 this.navStack.pushPathByName("DetailPage", { id: 100 });

其中:

  • "DetailPage" 表示目标页面名称(通常是在 route map 或 NavDestination 注册的名称)
  • 第二个参数是传递给页面的参数。 博客园

2. Pop(返回/出栈)

从当前栈顶返回上一个页面:

 this.navStack.pop();

3. Replace(替换当前页面)

将当前页面替换为另一个页面:

 this.navStack.replacePathByName("OtherPage", { foo: "bar" });

替换的行为不会增加栈深度,而是替换当前页面。 博客园


六、Navigation 配置与生命周期

虽然 Navigation 是 UI 组件,但它还有一些常见设置和生命周期行为:

NavigationLayout

Navigation 内通常包括:

  • 导航栏标题
  • 工具栏
  • 内容区

开发者可以在 Navigation 中直接设置标题/样式属性,或使用自定义插槽(CustomBuilder)来自定义 UI。 CSDN

生命周期回调

  • 子页面显示与隐藏具有生命周期。例如在 NavDestination 包装的页面上监听显示事件等。
  • 使用 Navigation 时,页面自身组件生命周期也会在 push/pop 时触发。 DEV Community

七、与 Router 的关系

在早期 HarmonyOS 中,页面跳转常常使用 Router 进行:

 router.pushUrl({ url: 'pages/Second' });

但随着 ArkTS Navigation 的出现,官方推荐:

优先使用 Navigation + NavPathStack 进行页面管理 而非 Router API,因为 Navigation 更契合声明式 UI 模型和栈式导航逻辑。 华为开发者

Router 仍可用于简单跳转(如跳转系统界面),但在应用内部正式结构建议全用 Navigation。 华为开发者


八、实战建议(Tips)

把 Navigation 放在 @Entry 组件的根节点 这样整个应用的路由管理更清晰。

所有可导航页面通过 NavDestination 或系统路由表注册 建立页面名称与组件映射。

统一使用 NavPathStack 管理栈 避免直接操纵 UI 状态而绕过栈逻辑。

使用 Auto 模式做跨设备适配 能够自动处理手机 / 平板 / 电视的大屏布局。 华为开发者


🏁 九、总结:为什么用 Navigation?

特性NavigationRouter
栈式管理
多端自适配⚠️
参数传递对象式URL query
嵌套导航支持有限

Navigation 是 ArkTS 推荐的导航方式,可实现灵活、声明式、栈式的页面导航体验,是构建复杂 HarmonyOS 应用的核心导航组件。 华为开发者