1# 组件导航和页面路由概述 2 3组件导航(Navigation)和页面路由(@ohos.router)均支持应用内的页面跳转,但组件导航支持在组件内部进行跳转,使用更灵活。组件导航具备更强的一次开发多端部署能力,可以进行更加灵活的页面栈操作,同时支持更丰富的动效和生命周期。因此,推荐使用组件导航(Navigation)来实现页面跳转以及组件内的跳转,以获得更佳的使用体验。 4 5## 架构差异 6 7从ArkUI组件树层级上来看,原先由Router管理的page在页面栈管理节点stage的下面。Navigation作为导航容器组件,可以挂载在单个page节点下,也可以叠加、嵌套。Navigation管理了标题栏、内容区和工具栏,内容区用于显示用户自定义页面的内容,并支持页面的路由能力。Navigation的这种设计上有如下优势: 8 9 10 111. 接口上显式区分标题栏、内容区和工具栏,实现更加灵活的管理和UX动效能力; 12 132. 显式提供路由容器概念,由开发者决定路由容器的位置,支持在全模态、半模态、弹窗中显示; 14 153. 整合UX设计和一多能力,默认提供统一的标题显示、页面切换和单双栏适配能力; 16 174. 基于通用[UIBuilder](../quick-start/arkts-builder.md)能力,由开发者决定页面别名和页面UI对应关系,提供更加灵活的页面配置能力; 18 195. 基于组件属性动效和共享元素动效能力,将页面切换动效转换为组件属性动效实现,提供更加丰富和灵活的切换动效; 20 216. 开放了页面栈对象,开发者可以继承,能更好的管理页面显示。 22 23## 能力对比 24 25| 业务场景 | Navigation | Router | 26| --------------------------------------------- | ------------------------------------- | -------------------------------------- | 27| 一多能力 | 支持,Auto模式自适应单栏跟双栏显示 | 不支持 | 28| 跳转指定页面 | pushPath & pushDestination | pushUrl & pushNameRoute | 29| 跳转HSP中页面 | 支持 | 支持 | 30| 跳转HAR中页面 | 支持 | 支持 | 31| 跳转传参 | 支持 | 支持 | 32| 获取指定页面参数 | 支持 | 不支持 | 33| 传参类型 | 传参为对象形式 | 传参为对象形式,对象中暂不支持方法变量 | 34| 跳转结果回调 | 支持 | 支持 | 35| 跳转单例页面 | 支持 | 支持 | 36| 页面返回 | 支持 | 支持 | 37| 页面返回传参 | 支持 | 支持 | 38| 返回指定路由 | 支持 | 支持 | 39| 页面返回弹窗 | 支持,通过路由拦截实现 | showAlertBeforeBackPage | 40| 路由替换 | replacePath & replacePathByName | replaceUrl & replaceNameRoute | 41| 路由栈清理 | clear | clear | 42| 清理指定路由 | removeByIndexes & removeByName | 不支持 | 43| 转场动画 | 支持 | 支持 | 44| 自定义转场动画 | 支持 | 支持,动画类型受限 | 45| 屏蔽转场动画 | 支持全局和单次 | 支持 设置pageTransition方法duration为0 | 46| geometryTransition共享元素动画 | 支持(NavDestination之间共享) | 不支持 | 47| 页面生命周期监听 | UIObserver.on('navDestinationUpdate') | UIObserver.on('routerPageUpdate') | 48| 获取页面栈对象 | 支持 | 不支持 | 49| 路由拦截 | 支持通过setInterception做路由拦截 | 不支持 | 50| 路由栈信息查询 | 支持 | getState() & getLength() | 51| 路由栈move操作 | moveToTop & moveIndexToTop | 不支持 | 52| 沉浸式页面 | 支持 | 不支持,需通过window配置 | 53| 设置页面标题栏(titlebar)和工具栏(toolbar) | 支持 | 不支持 | 54| 模态嵌套路由 | 支持 | 不支持 |