1# NavDestination 2 3作为子页面的根容器,用于显示[Navigation](ts-basic-components-navigation.md)的内容区。 4 5> **说明:** 6> 7> - 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 8> 9> - 该组件从API Version 11开始默认支持安全区避让特性(默认值为:expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])),开发者可以重写该属性覆盖默认行为,API Version 11之前的版本需配合[expandSafeArea](ts-universal-attributes-expand-safe-area.md)属性实现安全区避让。 10> 11> - NavDestination组件必须配合Navigation使用,作为Navigation目的页面的根节点,单独使用只能作为普通容器组件,不具备路由相关属性能力。 12> 13> - 如果页面栈中间页面的生命周期发生变化,跳转之前的栈顶Destination的生命周期(onWillShow, onShown, onHidden, onWillDisappear)与跳转之后的栈顶Destination的生命周期(onWillShow, onShown, onHidden, onWillDisappear)均在最后触发。 14> 15> - NavDestination未设置主副标题并且没有返回键时,不显示标题栏。 16 17## 子组件 18 19> **说明:** 20> 21> - 子组件类型:系统组件和自定义组件,支持渲染控制类型([if/else](../../../quick-start/arkts-rendering-control-ifelse.md)、[ForEach](../../../quick-start/arkts-rendering-control-foreach.md)和[LazyForEach](../../../quick-start/arkts-rendering-control-lazyforeach.md))。 22> - 子组件个数:多个。 23 24 25## 接口 26 27NavDestination() 28 29**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 30 31**系统能力:** SystemCapability.ArkUI.ArkUI.Full 32 33## 属性 34 35支持[通用属性](ts-component-general-attributes.md)。 36 37不推荐设置位置、大小等布局相关属性,可能会造成页面显示异常。 38 39### title 40 41title(value: string | CustomBuilder | NavDestinationCommonTitle | NavDestinationCustomTitle | Resource, options?: NavigationTitleOptions) 42 43设置页面标题。使用NavigationCustomTitle类型设置height高度时,[titleMode](ts-basic-components-navigation.md#titlemode)属性不会生效。字符串超长时,如果不设置副标题,先缩小再换行2行后以...截断。如果设置副标题,先缩小后以...截断。 44 45**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 46 47**系统能力:** SystemCapability.ArkUI.ArkUI.Full 48 49**参数:** 50 51| 参数名 | 类型 | 必填 | 说明 | 52| ------ | ------------------------------------------------------------ | ---- | ---------- | 53| value | string \| [CustomBuilder](ts-types.md#custombuilder8) \| [NavDestinationCommonTitle](#navdestinationcommontitle) \| [NavDestinationCustomTitle](#navdestinationcustomtitle) \| [Resource](ts-types.md#resource) | 是 | 页面标题。 | 54| options<sup>12+</sup> | [NavigationTitleOptions](ts-basic-components-navigation.md#navigationtitleoptions11) | 否 | 标题栏选项。 | 55 56### hideTitleBar 57 58hideTitleBar(value: boolean) 59 60设置是否隐藏标题栏。 61 62**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 63 64**系统能力:** SystemCapability.ArkUI.ArkUI.Full 65 66**参数:** 67 68| 参数名 | 类型 | 必填 | 说明 | 69| ------ | ------- | ---- | ------------------------------------------------------------ | 70| value | boolean | 是 | 是否隐藏标题栏。<br/>默认值:false<br/>true: 隐藏标题栏。<br/>false: 显示标题栏。 | 71 72### hideTitleBar<sup>13+</sup> 73 74hideTitleBar(hide: boolean, animated: boolean) 75 76设置是否隐藏标题栏,设置是否使用动画显隐标题栏。 77 78**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。 79 80**系统能力:** SystemCapability.ArkUI.ArkUI.Full 81 82**参数:** 83 84| 参数名 | 类型 | 必填 | 说明 | 85| ------ | ------- | ---- | ------------------------------------------------------------ | 86| hide | boolean | 是 | 是否隐藏标题栏。<br/>默认值:false<br/>true: 隐藏标题栏。<br/>false: 显示标题栏。 | 87| animated | boolean | 是 | 设置是否使用动画显隐标题栏。<br/>默认值:false<br/>true: 使用动画显示隐藏标题栏。<br/>false: 不使用动画显示隐藏标题栏。 | 88 89### toolbarConfiguration<sup>13+</sup> 90 91toolbarConfiguration(toolbarParam: Array<ToolbarItem> | CustomBuilder, options?: NavigationToolbarOptions) 92 93设置工具栏内容。未调用本接口时不显示工具栏。 94 95**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。 96 97**系统能力:** SystemCapability.ArkUI.ArkUI.Full 98 99**参数:** 100 101| 参数名 | 类型 | 必填 | 说明 | 102| ------------ | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | 103| toolbarParam | Array<[ToolbarItem](ts-basic-components-navigation.md#toolbaritem10)> \| [CustomBuilder](ts-types.md#custombuilder8) | 是 | 工具栏内容。<br/>使用Array<[ToolbarItem](ts-basic-components-navigation.md#toolbaritem10)>写法设置的工具栏有如下特性:<br/>-工具栏所有选项均分底部工具栏,在每个均分内容区布局文本和图标。<br/>-文本超长时,若工具栏选项个数小于5个,优先拓展选项的宽度,工具栏最大宽度与屏幕等宽,其次逐级缩小,缩小之后换行,最后截断。<br/>-竖屏最多支持显示5个图标,多余的图标会被放入自动生成的更多图标中,点击更多图标,可以展示剩余内容。横屏时,如果为[Split](ts-basic-components-navigation.md#navigationmode9枚举说明)模式,仍按照竖屏规则显示,如果为[Stack](ts-basic-components-navigation.md#navigationmode9枚举说明)模式需配合menus属性的Array<[NavigationMenuItem](ts-basic-components-navigation.md#navigationmenuitem)>使用,底部工具栏会自动隐藏,同时底部工具栏所有选项移动至页面右上角菜单。<br/>使用[CustomBuilder](ts-types.md#custombuilder8)写法为用户自定义工具栏选项,除均分底部工具栏外不具备以上功能。 | 104| options | [NavigationToolbarOptions](ts-basic-components-navigation.md#navigationtoolbaroptions11) | 否 | 工具栏选项。 | 105 106> **说明:** 107> 108> 不支持通过SymbolGlyphModifier对象的fontSize属性修改图标大小、effectStrategy属性修改动效、symbolEffect属性修改动效类型。 109 110### hideToolBar<sup>13+</sup> 111 112hideToolBar(hide: boolean, animated?: boolean) 113 114设置是否隐藏工具栏,设置是否使用动画显隐工具栏。 115 116**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。 117 118**系统能力:** SystemCapability.ArkUI.ArkUI.Full 119 120**参数:** 121 122| 参数名 | 类型 | 必填 | 说明 | 123| ------ | ------- | ---- | ------------------------------------------------------------ | 124| hide | boolean | 是 | 是否隐藏工具栏。<br/>默认值:false<br/>true: 隐藏工具栏。<br/>false: 显示工具栏。 | 125| animated | boolean | 否 | 设置是否使用动画显隐工具栏。<br/>默认值:false<br/>true: 使用动画显示隐藏工具栏。<br/>false: 不使用动画显示隐藏工具栏。 | 126 127### mode <sup>11+</sup> 128 129mode(value: NavDestinationMode) 130 131设置NavDestination类型,不支持动态修改。 132 133**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 134 135**系统能力:** SystemCapability.ArkUI.ArkUI.Full 136 137**参数:** 138 139| 参数名 | 类型 | 必填 | 说明 | 140| ------ | ---------------------------------------------------- | ---- | ------------------------------------------------------------ | 141| value | [NavDestinationMode](#navdestinationmode枚举说明-11) | 是 | NavDestination类型。<br/>默认值: NavDestinationMode.STANDARD | 142 143### backButtonIcon<sup>11+</sup> 144 145backButtonIcon(value: ResourceStr | PixelMap | SymbolGlyphModifier) 146 147> **说明:** 148> 149> 不支持通过SymbolGlyphModifier对象的fontSize属性修改图标大小、effectStrategy属性修改动效、symbolEffect属性修改动效类型。 150 151 152设置标题栏返回键图标。 153 154**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 155 156**系统能力:** SystemCapability.ArkUI.ArkUI.Full 157 158**参数:** 159 160| 参数名 | 类型 | 必填 | 说明 | 161| ------ | ------------------------------------------------------------ | ---- | ------------------ | 162| value | [ResourceStr](ts-types.md#resourcestr) \| [PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7) \| [SymbolGlyphModifier<sup>12+</sup>](ts-universal-attributes-attribute-modifier.md) | 是 | 标题栏返回键图标。 | 163 164### menus<sup>12+</sup> 165 166menus(value: Array<NavigationMenuItem> | CustomBuilder) 167 168> **说明:** 169> 170> 不支持通过SymbolGlyphModifier对象的fontSize属性修改图标大小、effectStrategy属性修改动效、symbolEffect属性修改动效类型。 171 172 173设置页面右上角菜单。不设置时不显示菜单项。使用Array<[NavigationMenuItem](ts-basic-components-navigation.md#navigationmenuitem)> 写法时,竖屏最多支持显示3个图标,横屏最多支持显示5个图标,多余的图标会被放入自动生成的更多图标。 174 175**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 176 177**系统能力:** SystemCapability.ArkUI.ArkUI.Full 178 179**参数:** 180 181| 参数名 | 类型 | 必填 | 说明 | 182| ------ | ------------------------------------------------------------ | ---- | ------------------ | 183| value | Array<[NavigationMenuItem](ts-basic-components-navigation.md#navigationmenuitem)> \| [CustomBuilder](ts-types.md#custombuilder8) | 是 | 页面右上角菜单。 | 184 185### ignoreLayoutSafeArea<sup>12+</sup> 186 187ignoreLayoutSafeArea(types?: Array<LayoutSafeAreaType>, edges?: Array<LayoutSafeAreaEdge>) 188 189控制组件的布局,使其扩展到非安全区域 190 191**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 192 193**系统能力:** SystemCapability.ArkUI.ArkUI.Full 194 195**参数:** 196 197| 参数名 | 类型 | 必填 | 说明 | 198| ------ | -------------------------------------------------- | ---- | ------------------------------------------------------------ | 199| types | Array <[LayoutSafeAreaType](ts-types.md#layoutsafeareatype12)> | 否 | 配置扩展安全区域的类型。<br />默认值: <br />[LayoutSafeAreaType.SYSTEM] | 200| edges | Array <[LayoutSafeAreaEdge](ts-types.md#layoutsafeareaedge12)> | 否 | 配置扩展安全区域的方向。<br /> 默认值: <br />[LayoutSafeAreaEdge.TOP, LayoutSafeAreaEdge.BOTTOM]。| 201 202> **说明:** 203> 204> 组件设置LayoutSafeArea之后生效的条件为: 205> 设置LayoutSafeAreaType.SYSTEM时,组件的边界与非安全区域重合时组件能够延伸到非安全区域下。例如:设备顶部状态栏高度100,组件在屏幕中纵向方位的绝对偏移需要在0到100之间。 206> 207> 若组件延伸到非安全区域内,此时在非安全区域里触发的事件(例如:点击事件)等可能会被系统拦截,优先响应状态栏等系统组件。 208 209### systemBarStyle<sup>12+</sup> 210 211systemBarStyle(style: Optional<SystemBarStyle>) 212 213当Navigation中显示当前NavDestination时,设置对应系统状态栏的样式。 214 215**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 216 217**系统能力:** SystemCapability.ArkUI.ArkUI.Full 218 219**参数:** 220 221| 参数名 | 类型 | 必填 | 说明 | 222| ------ | -------------- | ---- | ------------------ | 223| style | [Optional](ts-universal-attributes-custom-property.md#optional12)<[SystemBarStyle](../js-apis-window.md#systembarstyle12)> | 是 | 系统状态栏样式。 | 224 225> **说明:** 226> 227> 1. 必须配合Navigation使用,作为其Navigation目的页面的根节点时才能生效。 228> 2. 其他使用限制请参考Navigation对应的[systemBarStyle](ts-basic-components-navigation.md#systembarstyle12)属性说明。 229 230### systemTransition<sup>14+</sup> 231systemTransition(type: NavigationSystemTransitionType) 232 233设置NavDestination系统转场动画,支持分别设置系统标题栏动画和内容动画。 234 235**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。 236 237**系统能力:** SystemCapability.ArkUI.ArkUI.Full 238 239**参数:** 240 241| 参数名 | 类型 | 必填 | 说明 | 242| ------ | ---------------------------------------------------- | ---- | ------------------------------------------------------------ | 243| type | [NavigationSystemTransitionType](#navigationsystemtransitiontype14枚举说明) | 是 | 系统转场动画类型。<br/>默认值: NavigationSystemTransitionType.DEFAULT | 244 245### recoverable<sup>14+</sup> 246 247recoverable(recoverable: Optional<boolean>) 248 249配置NavDestination是否可恢复。如配置为可恢复,当应用进程异常退出并重新冷启动时,可自动创建该NavDestination。该功能需NavDestination对应的Navigation也配置了可恢复属性。 250 251**系统能力:** SystemCapability.ArkUI.ArkUI.Full 252 253**参数:** 254 255| 参数名 | 类型 | 必填 | 说明 | 256| ------ | -------------- | ---- | ------------------ | 257| recoverable | [Optional](ts-universal-attributes-custom-property.md#optional12)<boolean> | 是 | NavDestination是否可恢复,默认为不可恢复。<br/>默认值:false<br/>true:页面栈可恢复。<br/>false:页面栈不可恢复。 | 258 259> **使用说明:** 260> 261> 该接口需要配合Navigation的[recoverable](./ts-basic-components-navigation.md#recoverable14)接口使用。 262 263### bindToScrollable<sup>14+</sup> 264bindToScrollable(scrollers: Array<Scroller>) 265 266绑定NavDestination组件和可滚动容器组件(支持[List](./ts-container-list.md)、[Scroll](./ts-container-scroll.md)、[Grid](./ts-container-grid.md)、[WaterFlow](./ts-container-waterflow.md)),当滑动可滚动容器组件时,会触发所有与其绑定的NavDestination组件的标题栏和工具栏的显示和隐藏动效,上滑隐藏,下滑显示。一个NavDestination可与多个可滚动容器组件绑定,一个可滚动容器组件也可与多个NavDestination绑定。使用示例参见[示例1](#示例1)。 267 268> **说明:** 269> 270> - 只有NavDestination的标题栏或工具栏设置为可见时,联动效果才会生效。 271> - 当多个可滚动容器组件绑定了同一个NavDestination组件时,滚动任何一个容器都会触发标题栏和工具栏的显示或隐藏效果。且当任何一个可滚动容器组件滑动到底部或顶部位置时,会立即触发标题栏和工具栏的显示动效。因此,为了获得最佳用户体验,不建议同时触发多个可滚动容器组件的滚动事件。 272 273**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。 274 275**系统能力:** SystemCapability.ArkUI.ArkUI.Full 276 277**参数:** 278 279| 参数名 | 类型 | 必填 | 说明 | 280| ------ | ---------------------------------------------------- | ---- | ------------------------------------------------------------ | 281| scrollers | Array<[Scroller](./ts-container-scroll.md#scroller)> | 是 | 可滚动容器组件的控制器。 | 282 283### bindToNestedScrollable<sup>14+</sup> 284bindToNestedScrollable(scrollInfos: Array<NestedScrollInfo>) 285 286绑定NavDestination组件和嵌套的可滚动容器组件(支持[List](./ts-container-list.md)、[Scroll](./ts-container-scroll.md)、[Grid](./ts-container-grid.md)、[WaterFlow](./ts-container-waterflow.md)),当滑动父组件或子组件时,会触发所有与其绑定的NavDestination组件的标题栏和工具栏的显示和隐藏动效,上滑隐藏,下滑显示。一个NavDestination可与多个嵌套的可滚动容器组件绑定,嵌套的可滚动容器组件也可与多个NavDestination绑定。使用示例参见[示例1](#示例1)。 287 288> **说明:** 289> 290> - 只有NavDestination的标题栏或工具栏设置为可见时,联动效果才会生效。 291> - 当多个可滚动容器组件绑定了同一个NavDestination组件时,滚动任何一个容器都会触发标题栏和工具栏的显示或隐藏效果。且当任何一个可滚动容器组件滑动到底部或顶部位置时,会立即触发标题栏和工具栏的显示动效。因此,为了获得最佳用户体验,不建议同时触发多个可滚动容器组件的滚动事件。 292 293**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。 294 295**系统能力:** SystemCapability.ArkUI.ArkUI.Full 296 297**参数:** 298 299| 参数名 | 类型 | 必填 | 说明 | 300| ------ | ---------------------------------------------------- | ---- | ------------------------------------------------------------ | 301| scrollInfos | Array<[NestedScrollInfo](#nestedscrollinfo14)> | 是 | 嵌套的可滚动容器组件的控制器。 | 302 303### hideBackButton<sup>15+</sup> 304 305hideBackButton(hide: Optional<boolean>) 306 307设置是否隐藏标题栏中的返回键。 308 309**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 310 311**系统能力:** SystemCapability.ArkUI.ArkUI.Full 312 313**参数:** 314 315| 参数名 | 类型 | 必填 | 说明 | 316| ------ | ------- | ---- | ------------------------------------------------------------ | 317| hide | [Optional](ts-universal-attributes-custom-property.md#optional12)<boolean> | 是 | 是否隐藏标题栏中的返回键。 <br/>默认值:false<br/>true: 隐藏返回键。<br/>false: 显示返回键。 | 318 319### customTransition<sup>15+</sup> 320 321customTransition(delegate: NavDestinationTransitionDelegate) 322 323设置NavDestination自定义转场动画。 324 325> **说明:** 326> 327> 该属性与[systemTransition](#systemtransition14)同时设置时,后设置的属性生效。 328 329**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 330 331**系统能力:** SystemCapability.ArkUI.ArkUI.Full 332 333**参数:** 334 335| 参数名 | 类型 | 必填 | 说明 | 336| ------ | ------- | ---- | ------------------------------------------------------------ | 337| delegate | [NavDestinationTransitionDelegate](#navdestinationtransitiondelegate15) | 是 | NavDestination自定义动画的代理函数。 | 338 339## NavDestinationMode枚举说明 <sup>11+</sup> 340 341**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 342 343**系统能力:** SystemCapability.ArkUI.ArkUI.Full 344 345| 名称 | 值 | 说明 | 346| ---- | --- | ---------------------------------------- | 347| STANDARD | 0 | 标准模式的NavDestination。 | 348| DIALOG | 1 | 默认透明,进出页面栈不影响下层NavDestination的生命周期。<br />API version 13之前,默认无系统转场动画。从API version 13开始,支持系统转场动画。 | 349 350## NavigationSystemTransitionType<sup>14+</sup>枚举说明 351 352**系统能力:** SystemCapability.ArkUI.ArkUI.Full 353 354| 名称 | 值 | 说明 | 355| ---- | --- | ----- | 356| DEFAULT | 0 | 默认系统转场动画。<br/>**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。| 357| NONE| 1 | 无系统转场动画。<br/>**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。| 358| TITLE | 2 | 标题栏系统转场动画。<br/>**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。| 359| CONTENT | 3 | 内容区系统转场动画。<br/>**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。| 360| FADE<sup>15+</sup> | 4 | 渐变类型的系统转场动画。<br/>**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 | 361| EXPLODE<sup>15+</sup> | 5 | 中心缩放类型的系统转场动画。<br/>**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 | 362| SLIDE_RIGHT<sup>15+</sup> | 6 | 右侧平移类型的系统转场动画。<br/>**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 | 363| SLIDE_BOTTOM<sup>15+</sup> | 7 | 底部平移类型的系统转场动画。<br/>**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 | 364 365**说明:** 366> 367> 设置系统转场动画,支持分别设置系统标题栏动画和内容动画。 368> 369> 系统默认转场动画中只有STANDARD页面的push和pop动画有单独的标题栏动画,存在如下限制: 370> 1. 设置NavigationSystemTransitionType为TITLE时,系统转场只有标题栏动画。 371> 2. 设置NavigationSystemTransitionType为CONTENT时,系统转场只有内容区动画。 372> 373> 设置NONE或者TITLE时没有系统转场动画,设置CONTENT和DEFAULT时默认系统转场动画。 374 375## 事件 376 377除支持[通用事件](ts-component-general-events.md)外,还支持如下事件: 378 379### onShown<sup>10+</sup> 380 381onShown(callback: () => void) 382 383当该NavDestination页面显示时触发此回调。 384 385**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 386 387**系统能力:** SystemCapability.ArkUI.ArkUI.Full 388 389### onHidden<sup>10+</sup> 390 391onHidden(callback: () => void) 392 393当该NavDestination页面隐藏时触发此回调。 394 395**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 396 397**系统能力:** SystemCapability.ArkUI.ArkUI.Full 398 399### onWillAppear<sup>12+</sup> 400 401onWillAppear(callback: Callback\<void>) 402 403当该Destination挂载之前触发此回调。在该回调中允许修改页面栈,当前帧生效。 404 405**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 406 407**系统能力:** SystemCapability.ArkUI.ArkUI.Full 408 409### onWillShow<sup>12+</sup> 410 411onWillShow(callback: Callback\<void>) 412 413当该Destination显示之前触发此回调。 414 415**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 416 417**系统能力:** SystemCapability.ArkUI.ArkUI.Full 418 419### onWillHide<sup>12+</sup> 420 421onWillHide(callback: Callback\<void>) 422 423当该Destination隐藏之前触发此回调。 424 425**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 426 427**系统能力:** SystemCapability.ArkUI.ArkUI.Full 428 429### onWillDisappear<sup>12+</sup> 430 431onWillDisappear(callback: Callback\<void>) 432 433当该Destination卸载之前触发的生命周期(有转场动画时,在转场动画开始之前触发)。 434 435**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 436 437**系统能力:** SystemCapability.ArkUI.ArkUI.Full 438 439### onBackPressed<sup>10+</sup> 440 441onBackPressed(callback: () => boolean) 442 443当与Navigation绑定的页面栈中存在内容时,此回调生效。当点击返回键时,触发该回调。 444 445返回值为true时,表示重写返回键逻辑,返回值为false时,表示回退到上一个页面。 446 447**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 448 449**系统能力:** SystemCapability.ArkUI.ArkUI.Full 450 451### onReady<sup>11+</sup> 452 453onReady(callback: [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)<[NavDestinationContext](#navdestinationcontext11)>) 454 455当NavDestination即将构建子组件之前会触发此回调。 456 457**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 458 459**系统能力:** SystemCapability.ArkUI.ArkUI.Full 460 461### onResult<sup>15+</sup> 462 463onResult(callback: Optional\<Callback\<ESObject\>\>) 464 465NavDestination返回时触发该回调。 466 467**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 468 469**系统能力:** SystemCapability.ArkUI.ArkUI.Full 470 471**参数:** 472| 参数名 | 类型 | 必填 | 说明 | 473| ------ | ------ | ---- | ---------------- | 474|callback | [Optional](./ts-universal-attributes-custom-property.md)\<[Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<ESObject\>\>| 是 | 页面返回回调, 入参为pop接口传入的result参数。如果不传该参数,入参为undefined。| 475 476## NavDestinationCommonTitle 477 478**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 479 480**系统能力:** SystemCapability.ArkUI.ArkUI.Full 481 482| 名称 | 类型 | 必填 | 说明 | 483| ---- | ------ | ---- | ------ | 484| main | string \| [Resource<sup>14+<sup>](ts-types.md#resource) | 是 | 设置主标题。 | 485| sub | string \| [Resource<sup>14+<sup>](ts-types.md#resource) | 是 | 设置副标题。 | 486 487## NavDestinationCustomTitle 488 489**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 490 491**系统能力:** SystemCapability.ArkUI.ArkUI.Full 492 493| 名称 | 类型 | 必填 | 说明 | 494| ------- | ---------------------------------------- | ---- | -------- | 495| builder | [CustomBuilder](ts-types.md#custombuilder8) | 是 | 设置标题栏内容。 | 496| height | [TitleHeight](ts-appendix-enums.md#titleheight9) \| [Length](ts-types.md#length) | 是 | 设置标题栏高度。 | 497 498## NavDestinationContext<sup>11+</sup> 499 500**系统能力:** SystemCapability.ArkUI.ArkUI.Full 501 502| 名称 | 类型 | 必填 | 说明 | 503| ---- | ------ | ----- | ------ | 504| pathInfo | [NavPathInfo](ts-basic-components-navigation.md#navpathinfo10) | 是 | 跳转NavDestination时指定的参数。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 505| pathStack | [NavPathStack](ts-basic-components-navigation.md#navpathstack10) | 是 | 当前NavDestination所处的页面栈。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 506| navDestinationId<sup>12+</sup> | string | 否 | 当前NavDestination的唯一ID,由系统自动生成,和组件通用属性id无关。 <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。| 507 508### getConfigInRouteMap<sup>12+</sup> 509 510getConfigInRouteMap(): RouteMapConfig |undefined 511 512**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 513 514**系统能力:** SystemCapability.ArkUI.ArkUI.Full 515 516**返回值** 517 518| 类型 | 说明 | 519| --- | --- | 520| [RouteMapConfig](#routemapconfig12) | 当前页面路由配置信息。 | 521| undefined | 当该页面不是通过路由表配置时返回undefined。 | 522 523## RouteMapConfig<sup>12+</sup> 524 525**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 526 527**系统能力:** SystemCapability.ArkUI.ArkUI.Full 528 529| 名称 | 类型 |必填 | 说明 | 530| ---- | --- | ---- |----- | 531| name | string | 是 | 页面名称。| 532| pageSourceFile| string | 是 | 页面在当前包中的路径。| 533| data | Object | 是 | 页面自定义字段信息。| 534 535## NestedScrollInfo<sup>14+</sup> 536 537嵌套可滚动容器组件信息 538 539**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。 540 541**系统能力:** SystemCapability.ArkUI.ArkUI.Full 542 543| 名称 | 类型 |必填 | 说明 | 544| ---- | --- | ---- |----- | 545| parent | [Scroller](./ts-container-scroll.md#scroller) | 是 | 可滚动容器组件的控制器。 | 546| child | [Scroller](./ts-container-scroll.md#scroller) | 是 | 可滚动容器组件的控制器,child对应的组件需要是parent对应组件的子组件,且组件间存在嵌套滚动关系。| 547 548## NavDestinationTransition<sup>15+</sup> 549 550NavDestination自定义动画接口。 551 552**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 553 554**系统能力:** SystemCapability.ArkUI.ArkUI.Full 555 556| 名称 | 类型 |必填 | 说明 | 557| ---- | --- | ---- |----- | 558| onTransitionEnd | Callback\<void> | 否 | 转场动画结束时的回调函数。 | 559| duration | number | 否 | 转场动画的持续时间,默认值为1000(毫秒)。 | 560| curve | [Curve](ts-appendix-enums.md#curve) | 否 | 动画的曲线类型,默认值为[Curve.EaseInOut](ts-appendix-enums.md#curve)。 | 561| delay | number | 否 | 转场动画的延迟。默认值为0。 | 562| event | Callback\<void> | 是 | 指定转场动效的闭包函数,系统会根据闭包中对组件UI状态的修改,生成对应的过渡动画。参见[animateTo](../js-apis-arkui-UIContext.md#animateto)中的event。 | 563 564## NavDestinationTransitionDelegate<sup>15+</sup> 565 566type NavDestinationTransitionDelegate = (operation: NavigationOperation, isEnter: boolean) => Array\<NavDestinationTransition> | undefined 567 568NavDestination自定义转场动画的代理函数。 569 570**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 571 572**系统能力:** SystemCapability.ArkUI.ArkUI.Full 573 574**参数:** 575 576| 参数名 | 类型 | 必填 | 说明 | 577|------|--------|----|-----------------------| 578| operation | [NavigationOperation](ts-basic-components-navigation.md#navigationoperation11枚举说明) | 是 | 当前页面转场的操作类型。 | 579| isEnter | boolean | 是 | 当前页面是否为入场页面。 | 580 581**返回值:** 582 583| 类型 | 说明 | 584|---------|-----------| 585| Array<[NavDestinationTransition](#navdestinationtransition15)> \| undefined | NavDestination页面的自定义动画集合。如果返回undefined则做系统默认动画。 | 586 587## 示例 588 589### 示例1(标题栏工具栏与可滚动类组件联动) 590 591以下示例主要演示NavDestination绑定可滚动容器组件来实现滚动内容时触发标题栏和工具栏显示隐藏的效果。 592 593```ts 594import { SymbolGlyphModifier } from '@kit.ArkUI'; 595 596@Component 597struct MyPageOne { 598 private listScroller: Scroller = new Scroller(); 599 private scrollScroller: Scroller = new Scroller(); 600 private arr: number[] = []; 601 602 aboutToAppear(): void { 603 for (let i = 0; i < 30; i++) { 604 this.arr.push(i); 605 } 606 } 607 608 build() { 609 NavDestination() { 610 Scroll(this.scrollScroller) { 611 Column() { 612 List({ space: 0, initialIndex: 0, scroller: this.listScroller }) { 613 ForEach(this.arr, (item: number, index: number) => { 614 ListItem() { 615 Text('' + item) 616 .height(100) 617 .fontSize(16) 618 .textAlign(TextAlign.Center) 619 .width('90%') 620 .margin({ left: '5%' }) 621 .borderRadius(10) 622 .backgroundColor(Color.Gray) 623 } 624 }, (item: string) => item); 625 }.width('100%').height('80%').scrollBar(BarState.Off) 626 .nestedScroll({ scrollForward: NestedScrollMode.SELF_FIRST, scrollBackward: NestedScrollMode.SELF_FIRST }) 627 628 ForEach(this.arr, (item: number, index: number) => { 629 ListItem() { 630 Text('' + item) 631 .height(100) 632 .fontSize(16) 633 .textAlign(TextAlign.Center) 634 .width('90%') 635 .margin({ top: '5%' }) 636 .borderRadius(10) 637 .backgroundColor(Color.Pink) 638 } 639 }, (item: string) => item); 640 } 641 } 642 .width('100%') 643 .scrollBar(BarState.Off) 644 .scrollable(ScrollDirection.Vertical) 645 .edgeEffect(EdgeEffect.Spring) 646 } 647 .title('PageOne', { backgroundColor: Color.Yellow, barStyle: BarStyle.STACK }) 648 .toolbarConfiguration([ 649 { 650 value: 'item1', 651 symbolIcon: new SymbolGlyphModifier($r('sys.symbol.phone_badge_star')) 652 } 653 ], { backgroundColor: Color.Orange, barStyle: BarStyle.STACK }) 654 // 绑定有父子关系的可滚动容器组件 655 .bindToNestedScrollable([{ parent: this.scrollScroller, child: this.listScroller }]) 656 } 657} 658 659@Component 660struct MyPageTwo { 661 private listScroller: Scroller = new Scroller(); 662 private arr: number[] = []; 663 664 aboutToAppear(): void { 665 for (let i = 0; i < 30; i++) { 666 this.arr.push(i); 667 } 668 } 669 670 build() { 671 NavDestination() { 672 List({ scroller: this.listScroller }) { 673 ForEach(this.arr, (item: number, index: number) => { 674 ListItem() { 675 Text('' + item) 676 .height(100) 677 .fontSize(16) 678 .textAlign(TextAlign.Center) 679 .width('90%') 680 .margin({ left: '5%' }) 681 .borderRadius(10) 682 .backgroundColor(Color.Gray) 683 } 684 }, (item: string) => item); 685 }.width('100%') 686 } 687 .title('PageTwo', { backgroundColor: Color.Yellow, barStyle: BarStyle.STACK }) 688 .toolbarConfiguration([ 689 { 690 value: 'item1', 691 symbolIcon: new SymbolGlyphModifier($r('sys.symbol.phone_badge_star')) 692 } 693 ], { backgroundColor: Color.Orange, barStyle: BarStyle.STACK }) 694 // 绑定可滚动容器组件 695 .bindToScrollable([this.listScroller]) 696 } 697} 698 699@Entry 700@Component 701struct Index { 702 private stack: NavPathStack = new NavPathStack(); 703 704 @Builder 705 MyPageMap(name: string) { 706 if (name === 'myPageOne') { 707 MyPageOne() 708 } else { 709 MyPageTwo() 710 } 711 } 712 713 build() { 714 Navigation(this.stack) { 715 Column() { 716 Button('push PageOne').onClick(() => { 717 this.stack.pushPath({ name: 'myPageOne' }) 718 }) 719 Button('push PageTwo').onClick(() => { 720 this.stack.pushPath({ name: 'myPageTwo' }) 721 }) 722 }.height('40%').justifyContent(FlexAlign.SpaceAround) 723 }.width('100%') 724 .height('100%') 725 .title({ main: 'MainTitle', sub: 'subTitle' }) 726 .navDestination(this.MyPageMap) 727 } 728} 729``` 730 731 732### 示例2(设置NavDestination自定义转场) 733 734以下示例主要演示NavDestination设置自定义转场动画属性[customTransition](#customtransition15)的效果。 735 736```ts 737@Entry 738@Component 739struct NavDestinationCustomTransition { 740 stack: NavPathStack = new NavPathStack() 741 742 @Builder 743 pageMap(name: string) { 744 if (name) { 745 NavDest() 746 } 747 } 748 749 aboutToAppear(): void { 750 this.stack.pushPath({name: 'dest0'}) 751 } 752 753 build() { 754 Navigation(this.stack) { 755 // empty 756 } 757 .navDestination(this.pageMap) 758 .hideNavBar(true) 759 .title('Main Page') 760 .titleMode(NavigationTitleMode.Mini) 761 } 762} 763 764declare type voidFunc = () => void; 765 766@Component 767struct NavDest { 768 @State name: string = 'NA' 769 @State destWidth: string = '100%' 770 stack: NavPathStack = new NavPathStack() 771 @State y: string = '0'; 772 773 build() { 774 NavDestination() { 775 Column() { 776 Button('push next page', { stateEffect: true, type: ButtonType.Capsule }) 777 .width('80%') 778 .height(40) 779 .margin(20) 780 .onClick(() => { 781 this.stack.pushPath({ name: this.name == 'PageOne' ? "PageTwo" : "PageOne" }) 782 }) 783 } 784 .size({ width: '100%', height: '100%' }) 785 } 786 .title(this.name) 787 .translate({ y: this.y }) 788 .onReady((context) => { 789 this.name = context.pathInfo.name; 790 this.stack = context.pathStack; 791 }) 792 .backgroundColor(this.name == 'PageOne' ? '#F1F3F5' : '#ff11dee5') 793 .customTransition( 794 (op: NavigationOperation, isEnter: boolean) 795 : Array<NavDestinationTransition> | undefined => { 796 console.log('[NavDestinationTransition]', 'reached delegate in frontend, op: ' + op + ', isEnter: ' + isEnter); 797 798 let transitionOneEvent: voidFunc = () => { console.log('[NavDestinationTransition]', 'reached transitionOne, empty now!'); } 799 let transitionOneFinishEvent: voidFunc = () => { console.log('[NavDestinationTransition]', 'reached transitionOneFinish, empty now!'); } 800 let transitionOneDuration: number = 500; 801 if (op === NavigationOperation.PUSH) { 802 if (isEnter) { 803 // ENTER_PUSH 804 this.y = '100%'; 805 transitionOneEvent = () => { 806 console.log('[NavDestinationTransition]', 'transitionOne, push & isEnter'); 807 this.y = '0'; 808 } 809 } else { 810 // EXIT_PUSH 811 this.y = '0'; 812 transitionOneEvent = () => { 813 console.log('[NavDestinationTransition]', 'transitionOne, push & !isEnter'); 814 this.y = '0'; 815 } 816 transitionOneDuration = 450 817 } 818 } else if (op === NavigationOperation.POP) { 819 if (isEnter) { 820 // ENTER_POP 821 this.y = '0'; 822 transitionOneEvent = () => { 823 console.log('[NavDestinationTransition]', 'transitionOne, pop & isEnter'); 824 this.y = '0'; 825 } 826 } else { 827 // EXIT_POP 828 this.y = '0'; 829 transitionOneEvent = () => { 830 console.log('[NavDestinationTransition]', 'transitionOne, pop & !isEnter'); 831 this.y = '100%'; 832 } 833 } 834 } else { 835 console.log('[NavDestinationTransition]', '----- NOT-IMPL BRANCH of NAV-DESTINATION CUSTOM TRANSITION -----'); 836 } 837 838 let transitionOne: NavDestinationTransition = { 839 duration: transitionOneDuration, 840 delay: 0, 841 curve: Curve.Friction, 842 event: transitionOneEvent, 843 onTransitionEnd: transitionOneFinishEvent 844 }; 845 846 let transitionTwoEvent: voidFunc = () => { console.log('[NavDestinationTransition]', 'reached transitionTwo, empty now!'); } 847 let transitionTwo: NavDestinationTransition = { 848 duration: 1000, 849 delay: 0, 850 curve: Curve.EaseInOut, 851 event: transitionTwoEvent, 852 onTransitionEnd: () => { console.log('[NavDestinationTransition]', 'reached Two\'s finish'); } 853 }; 854 855 return [ 856 transitionOne, 857 transitionTwo, 858 ]; 859 }) 860 } 861} 862``` 863 864 865### 示例3(设置指定的NavDestination系统转场) 866 867以下示例主要演示NavDestination设置系统转场动画[systemTransition](#systemtransition14)为Fade、Explode、SlideBottom与SlideRight时的转场效果。 868 869```ts 870@Entry 871@Component 872struct NavDestinationSystemTransition { 873 @Provide stack: NavPathStack = new NavPathStack() 874 @Provide homePageTransitionType: NavigationSystemTransitionType = NavigationSystemTransitionType.DEFAULT; 875 876 @Builder 877 pageMap(name: string) { 878 if (name === 'Fade') { 879 Fade() 880 } else if (name === 'Explode') { 881 Explode() 882 } else if (name === 'SlideRight') { 883 SlideRight() 884 } else if (name === 'SlideBottom') { 885 SlideBottom() 886 } else { 887 Dest() 888 } 889 } 890 891 aboutToAppear(): void { 892 this.stack.pushPath({name: 'Dest'}) 893 } 894 895 build() { 896 Navigation(this.stack) { 897 // empty 898 } 899 .navDestination(this.pageMap) 900 .hideNavBar(true) 901 } 902} 903 904@Component 905struct Dest { 906 @Consume stack: NavPathStack; 907 @Consume homePageTransitionType: NavigationSystemTransitionType; 908 @State name: string = 'NA'; 909 910 build() { 911 NavDestination() { 912 HomeBody() 913 } 914 .title('Navigation System Animation') 915 .onReady((context) => { 916 this.name = context.pathInfo.name 917 }) 918 .systemTransition(this.homePageTransitionType) 919 } 920} 921 922@Component 923struct Fade { 924 @Consume stack: NavPathStack; 925 @State name: string = 'NA'; 926 927 build() { 928 NavDestination() { 929 DestBody({ 930 name: this.name 931 }) 932 } 933 .title(this.name) 934 .onReady((context) => { 935 this.name = context.pathInfo.name 936 }) 937 .systemTransition(NavigationSystemTransitionType.FADE) 938 } 939} 940 941@Component 942struct Explode { 943 @Consume stack: NavPathStack; 944 @State name: string = 'NA'; 945 946 build() { 947 NavDestination() { 948 DestBody({ 949 name: this.name 950 }) 951 } 952 .title(this.name) 953 .onReady((context) => { 954 this.name = context.pathInfo.name 955 }) 956 .systemTransition(NavigationSystemTransitionType.EXPLODE) 957 } 958} 959 960@Component 961struct SlideRight { 962 @Consume stack: NavPathStack; 963 @State name: string = 'NA'; 964 965 build() { 966 NavDestination() { 967 DestBody({ 968 name: this.name 969 }) 970 } 971 .title(this.name) 972 .onReady((context) => { 973 this.name = context.pathInfo.name 974 }) 975 .systemTransition(NavigationSystemTransitionType.SLIDE_RIGHT) 976 } 977} 978 979@Component 980struct SlideBottom { 981 @Consume stack: NavPathStack; 982 @State name: string = 'NA'; 983 984 build() { 985 NavDestination() { 986 DestBody({ 987 name: this.name 988 }) 989 } 990 .title(this.name) 991 .onReady((context) => { 992 this.name = context.pathInfo.name 993 }) 994 .systemTransition(NavigationSystemTransitionType.SLIDE_BOTTOM) 995 } 996} 997 998@Component 999struct DestBody { 1000 name: string = 'NA' 1001 1002 columnTextSize: number = 22 1003 columnTextFontWeight: FontWeight = FontWeight.Bolder 1004 columnWidth: string = '65%' 1005 columnPadding: number = 22 1006 columnMargin: number = 10 1007 columnBorderRadius: number = 10 1008 1009 build() { 1010 Column() { 1011 Column() 1012 .width('85') 1013 .height(50) 1014 .backgroundColor(Color.White) 1015 Column() { 1016 Text(this.name) 1017 .fontSize(this.columnTextSize) 1018 .fontWeight(this.columnTextFontWeight) 1019 } 1020 .width(this.columnWidth) 1021 .padding(this.columnPadding) 1022 .margin(this.columnMargin) 1023 .borderRadius(this.columnBorderRadius) 1024 .shadow(ShadowStyle.OUTER_DEFAULT_LG) 1025 } 1026 } 1027} 1028 1029@Component 1030struct HomeBody { 1031 @Consume stack: NavPathStack; 1032 @Consume homePageTransitionType: NavigationSystemTransitionType; 1033 1034 columnTextSize: number = 22 1035 columnTextFontWeight: FontWeight = FontWeight.Bolder 1036 columnWidth: string = '85%' 1037 columnPadding: number = 22 1038 columnMargin: number = 10 1039 columnBorderRadius: number = 10 1040 columnShadow: ShadowStyle = ShadowStyle.OUTER_DEFAULT_MD 1041 1042 build() { 1043 Column() { 1044 Search({ value: 'Search' }) 1045 .width(this.columnWidth) 1046 1047 Column() { 1048 Text('fade') 1049 .fontSize(this.columnTextSize) 1050 .fontWeight(this.columnTextFontWeight) 1051 } 1052 .width(this.columnWidth) 1053 .padding(this.columnPadding) 1054 .margin(this.columnMargin) 1055 .borderRadius(this.columnBorderRadius) 1056 .shadow(this.columnShadow) 1057 .onClick(() => { 1058 this.homePageTransitionType = NavigationSystemTransitionType.FADE 1059 this.stack.pushPath({name: 'Fade'}) 1060 }) 1061 1062 Column() { 1063 Text('explode') 1064 .fontSize(this.columnTextSize) 1065 .fontWeight(this.columnTextFontWeight) 1066 } 1067 .width(this.columnWidth) 1068 .padding(this.columnPadding) 1069 .margin(this.columnMargin) 1070 .borderRadius(this.columnBorderRadius) 1071 .shadow(this.columnShadow) 1072 .onClick(() => { 1073 this.homePageTransitionType = NavigationSystemTransitionType.EXPLODE 1074 this.stack.pushPath({name: 'Explode'}) 1075 }) 1076 1077 Column() { 1078 Text('slide right') 1079 .fontSize(this.columnTextSize) 1080 .fontWeight(this.columnTextFontWeight) 1081 } 1082 .width(this.columnWidth) 1083 .padding(this.columnPadding) 1084 .margin(this.columnMargin) 1085 .borderRadius(this.columnBorderRadius) 1086 .shadow(this.columnShadow) 1087 .onClick(() => { 1088 this.homePageTransitionType = NavigationSystemTransitionType.SLIDE_RIGHT 1089 this.stack.pushPath({name: 'SlideRight'}) 1090 }) 1091 1092 Column() { 1093 Text('slide bottom') 1094 .fontSize(this.columnTextSize) 1095 .fontWeight(this.columnTextFontWeight) 1096 } 1097 .width(this.columnWidth) 1098 .padding(this.columnPadding) 1099 .margin(this.columnMargin) 1100 .borderRadius(this.columnBorderRadius) 1101 .shadow(this.columnShadow) 1102 .onClick(() => { 1103 this.homePageTransitionType = NavigationSystemTransitionType.SLIDE_BOTTOM 1104 this.stack.pushPath({name: 'SlideBottom'}) 1105 }) 1106 } 1107 } 1108} 1109``` 1110 1111 1112 1113 1114 1115NavDestination其他用法可参考[Navigation示例](ts-basic-components-navigation.md#示例1)。 1116