HarmonyOS 鸿蒙Next中Router和Navigation在跳转上的区别

HarmonyOS 鸿蒙Next中Router和Navigation在跳转上的区别

  • Router实现的是页面级跳转,作用区域为整个窗口中的页面,只能实现简单的跳转。
  • Navigation实现的是组件级跳转,作用区域为Navigation组件所在的区域,能实现自定义动画、生命周期监听等各种功能。

下面有一个示例,首页是“路由页面1”,示例如下:

// Index.ets
@Entry
@Component
struct Index {

  build() {
    Column() {
      Text(`路由页面1`).width('100%').fontSize(22).fontWeight(2).padding(10)
      Button(`Router push 导航1主页面`).width('80%').margin({ top: 10, bottom: 10 })
        .onClick(() => {
          this.getUIContext().getRouter().pushUrl({ url: 'pages/Navigation1Index' });
        })
    }.width('100%').height('100%')
  }
}

页面结构如下:

页面结构图

可以看到,页面上没有Navigation组件,根组件是Index(在一些设备上可能父节点上还有个root,但是不影响内部的页面结构)。

由于页面上没有Navigation,所以只能使用Router跳转。现在调用pushUrl跳转到导航1主页面,示例如下:

@Component
export struct Navigation1Index {
  pathStack: NavPathStack = new NavPathStack();

  @Builder
  pagesMap(name: string) {
    if (name == 'Navigation1Page1') {
      Navigation1Page1()
    } else if (name == 'Navigation1Page2') {
      Navigation1Page2()
    }
  }

  build() {
    Navigation(this.pathStack) {
      Button(`Navigation push 导航1页面1`).width('80%').margin({ top: 10, bottom: 10 })
        .onClick(() => {
          this.pathStack.pushPath({ name: 'Navigation1Page1' });
        })
    }.title('导航1主页面')
    .titleMode(NavigationTitleMode.Mini)
    .navDestination(this.pagesMap)
  }
}

这时页面的根组件会发生变化,页面结构如下:

页面结构图

可以看到,页面的根组件已经换成了Navigation1Index,之前的Index已经不存在了,这就是页面级跳转

而在导航1主页面,通过与Navigation绑定的NavPathStack调用pushPath接口跳转到“导航1页面1”,示例如下:

@Component
export struct Navigation1Page1 {
  pathStack: NavPathStack | undefined = undefined;

  build() {
    NavDestination() {
      Button('Navigation push 导航1页面2').width('80%').margin({ top: 10, bottom: 10 })
        .onClick(() => {
          this.pathStack?.pushPath({ name: 'Navigation1Page2' });
        })
      Button('Navigation pop').width('80%').margin({ top: 10, bottom: 10 })
        .onClick(() => {
          this.pathStack?.pop();
        })
    }.title('导航1页面1')
    .onReady((context: NavDestinationContext) => {
      this.pathStack = context.pathStack;
    })
  }
}

页面结构如下:

页面结构图

可以看到,对比“导航1主页面”的结构,Navigation1Index、Navigation和NavDestinationContent节点都在页面上,“导航1页面1”的NavDestination组件挂在NavDestinationContent下面,页面的具体内容都在NavDestination组件内绘制,这就是组件级跳转。

此时再通过NavPathStack调用pushPath接口跳转到“导航1页面2”页面,页面结构如下:

页面结构图

可以看到,对比“导航1页面1”的结构,Navigation1Index、Navigation和NavDestinationContent节点都没有发生变化,只是替换了NavDestination节点。


更多关于HarmonyOS 鸿蒙Next中Router和Navigation在跳转上的区别的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,Router和Navigation都用于页面跳转,但实现方式不同。Router通过URL进行页面路由,支持跨应用跳转,适用于复杂场景。Navigation则通过页面栈管理,主要用于同一应用内的页面跳转,操作更简单。Router更灵活,Navigation更直观。

更多关于HarmonyOS 鸿蒙Next中Router和Navigation在跳转上的区别的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,Router和Navigation的主要区别在于跳转粒度和功能范围:

  1. Router是页面级跳转机制,会替换整个窗口内容,适合简单的全屏页面切换。从示例可以看出,使用Router.pushUrl后原Index页面完全被Navigation1Index取代。

  2. Navigation是组件级跳转,通过NavPathStack管理导航栈,只更新Navigation组件内部的内容区域(NavDestination)。如示例所示,pushPath/pop操作只会替换NavDestination节点,保持外层Navigation框架不变。

关键差异点:

  • Router跳转会重建整个页面树,而Navigation保持外层组件树稳定
  • Navigation支持自定义转场动画、生命周期监听等高级功能
  • Navigation适合实现单页面内的多视图切换,Router适合跨页面导航

从性能角度考虑,频繁的局部更新应优先使用Navigation,而需要完全切换页面时使用Router。

回到顶部