HarmonyOS 中 Navigation 和 router是一回事吗?

在鸿蒙(HarmonyOS)中,Navigation 组件 并不是一种独立的路由机制,而是一个 UI 导航容器组件 ,用于构建具有导航功能的界面结构(如底部导航栏、侧边栏等)。它的主要职责是管理 同级页面或子组件的切换和布局 ,而非直接处理页面跳转逻辑。不过,开发者通常会结合 @ohos.router 模块和 Navigation 组件共同实现完整的导航功能。


  • 功能定位
    Navigation 是 ArkUI 提供的一个 布局容器组件 ,用于实现常见的导航模式(如 Tab 导航、抽屉导航等)。它通过 NavRouterNavDestination 管理子组件的切换。
  • 与路由的区别
    • 路由(@ohos.router:负责页面栈管理、跨页面跳转和参数传递(底层逻辑)。
    • Navigation 组件:负责导航栏的 UI 展示和交互(视觉层),需要与路由配合使用。

场景:实现底部 Tab 导航

typescript 复制代码
// main.ets
import router from '@ohos.router';

@Entry
@Component
struct NavigationExample {
  @State activeIndex: number = 0; // 当前选中的 Tab 索引

  build() {
    Navigation() {
      // 底部 Tab 栏
      NavDestination() {
        Column() {
          Text('首页').fontSize(20)
          Button('跳转到详情页')
            .onClick(() => {
              // 通过路由跳转到详情页
              router.pushUrl({ url: 'pages/DetailPage' });
            })
        }
        .width('100%')
        .height('100%')
      }
      .title('首页')
      .icon($r('app.media.home'))

      NavDestination() {
        Column() {
          Text('设置页').fontSize(20)
        }
        .width('100%')
        .height('100%')
      }
      .title('设置')
      .icon($r('app.media.settings'))
    }
    .title('导航示例')
    .mode(NavigationMode.Stack) // 堆栈模式
    .navBarPosition(NavigationPosition.Bottom) // 底部导航栏
    .onNavStateChange((index: number) => {
      // Tab 切换事件
      this.activeIndex = index;
    })
  }
}

代码解析

  1. Navigation 容器 :包裹所有导航页面(NavDestination)。
  2. NavDestination:定义每个 Tab 对应的内容和样式。
  3. 路由跳转 :在 Tab 页面内仍使用 router.pushUrl() 实现跨页面跳转。
  4. 导航模式
    • Stack:堆栈模式(默认),适合层级跳转。
    • Split:分屏模式(大屏设备适用)。

职责 Navigation 组件 路由(@ohos.router
页面跳转 不直接处理跳转,需调用 router API 通过 pushUrl/back 管理跳转
导航栏 UI 提供 Tab、标题栏等视觉元素 无 UI 元素
页面栈管理 不管理页面栈 维护页面栈(前进、后退)
参数传递 不支持直接传参 通过 params 传递 JSON 对象
适用场景 同级页面切换(如 Tab 导航) 跨层级页面跳转(如详情页、表单页)

4. 常见误区澄清

误区 1Navigation 可以替代路由

纠正

  • Navigation 仅负责 同级页面的布局和切换,无法处理跨层级跳转或页面栈管理。
  • 若需要跳转到其他层级的页面(如从首页跳转到详情页),仍需使用 router.pushUrl()

误区 2Navigation 自带路由功能

纠正

  • Navigation 的 Tab 切换本质上是组件显隐控制,而非真正的路由跳转。
  • 若需要页面生命周期管理(如 onPageShow/onPageHide),仍需依赖 @ohos.router

typescript 复制代码
// 在 Tab 页面内实现路由跳转
Button('跳转到独立页面')
  .onClick(() => {
    router.pushUrl({
      url: 'pages/IndependentPage',
      params: { from: 'Tab1' }
    });
  })

// 返回时处理路由
Button('返回')
  .onClick(() => {
    router.back();
  })

总结

  • Navigation 组件UI 导航容器,用于构建 Tab 栏、侧边栏等导航结构的界面。
  • 路由(@ohos.router底层跳转逻辑,负责页面栈管理和参数传递。
  • 二者需结合使用:Navigation 管理同级页面的布局,路由处理跨层级跳转。
相关推荐
xq95273 小时前
鸿蒙next 获取versionCode和versionName
harmonyos
鸿蒙小白龙4 小时前
openharmony之恢复出厂设置需求总结
harmonyos·鸿蒙·鸿蒙系统
深海的鲸同学 luvi5 小时前
【HarmonyOS】H5 实现在浏览器中正常跳转 AppLinking 至应用
华为·harmonyos
zhanshuo16 小时前
HarmonyOS 实战:学会在鸿蒙中使用第三方 JavaScript 库(附完整 Demo)
harmonyos
zhanshuo16 小时前
鸿蒙应用权限处理全攻略:从配置到相机拍照,一篇文章讲透
harmonyos
AlbertZein18 小时前
HarmonyOS5 凭什么学鸿蒙—— GetContext
架构·harmonyos
森之鸟21 小时前
flutter项目适配鸿蒙
flutter·华为·harmonyos
奶糖不太甜1 天前
鸿蒙图片资源加载全攻略:从基础到性能优化
harmonyos·图片资源
小小小小小星1 天前
鸿蒙多端适配开发指南:从入门到实战
harmonyos
鸿蒙小灰1 天前
鸿蒙开发之仿抖音APP教程:方法论与技术探索
harmonyos