1# Router切换Navigation 2<!--Kit: ArkUI--> 3<!--Subsystem: ArkUI--> 4<!--Owner: @mayaolll--> 5<!--Designer: @jiangdayuan--> 6<!--Tester: @lxl007--> 7<!--Adviser: @HelloCrease--> 8 9鉴于组件导航(Navigation)支持更丰富的动效、一次开发多端部署能力和更灵活的栈操作。本文主要从页面跳转、动效和生命周期等方面介绍如何从Router切换到Navigation。 10 11## 页面结构 12 13Router路由的页面是一个`@Entry`修饰的Component,每一个页面都需要在`main_page.json`中声明。 14 15```json 16// main_page.json 17{ 18 "src": [ 19 "pages/Index", 20 "pages/pageOne", 21 "pages/pageTwo" 22 ] 23} 24``` 25 26以下为Router页面的示例。 27 28```ts 29// Index.ets 30import { router } from '@kit.ArkUI'; 31 32@Entry 33@Component 34struct Index { 35 @State message: string = 'Hello World'; 36 37 build() { 38 Row() { 39 Column() { 40 Text(this.message) 41 .fontSize(50) 42 .fontWeight(FontWeight.Bold) 43 Button('router to pageOne', { stateEffect: true, type: ButtonType.Capsule }) 44 .width('80%') 45 .height(40) 46 .margin(20) 47 .onClick(() => { 48 this.getUIContext().getRouter().pushUrl({ 49 url: 'pages/pageOne' // 目标url 50 }, router.RouterMode.Standard, (err) => { 51 if (err) { 52 console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`); 53 return; 54 } 55 console.info('Invoke pushUrl succeeded.'); 56 }) 57 }) 58 } 59 .width('100%') 60 } 61 .height('100%') 62 } 63} 64``` 65 66```ts 67// pageOne.ets 68@Entry 69@Component 70struct pageOne { 71 @State message: string = 'This is pageOne'; 72 73 build() { 74 Row() { 75 Column() { 76 Text(this.message) 77 .fontSize(50) 78 .fontWeight(FontWeight.Bold) 79 Button('router back to Index', { stateEffect: true, type: ButtonType.Capsule }) 80 .width('80%') 81 .height(40) 82 .margin(20) 83 .onClick(() => { 84 this.getUIContext().getRouter().back(); 85 }) 86 } 87 .width('100%') 88 } 89 .height('100%') 90 } 91} 92``` 93 94而基于Navigation的路由页面分为导航页和子页,导航页又叫Navbar,是Navigation包含的子组件,子页是NavDestination包含的子组件。 95 96以下为Navigation导航页的示例。 97 98```ts 99// Index.ets 100@Entry 101@Component 102struct Index { 103 pathStack: NavPathStack = new NavPathStack(); 104 105 build() { 106 Navigation(this.pathStack) { 107 Column() { 108 Button('Push PageOne', { stateEffect: true, type: ButtonType.Capsule }) 109 .width('80%') 110 .height(40) 111 .margin(20) 112 .onClick(() => { 113 this.pathStack.pushPathByName('pageOne', null); 114 }) 115 }.width('100%').height('100%') 116 } 117 .title("Navigation") 118 .mode(NavigationMode.Stack) 119 } 120} 121``` 122以下为Navigation子页的示例。 123 124```ts 125// PageOne.ets 126 127@Builder 128export function PageOneBuilder() { 129 PageOne(); 130} 131 132@Component 133export struct PageOne { 134 pathStack: NavPathStack = new NavPathStack(); 135 136 build() { 137 NavDestination() { 138 Column() { 139 Button('回到首页', { stateEffect: true, type: ButtonType.Capsule }) 140 .width('80%') 141 .height(40) 142 .margin(20) 143 .onClick(() => { 144 this.pathStack.clear(); 145 }) 146 }.width('100%').height('100%') 147 }.title('PageOne') 148 .onReady((context: NavDestinationContext) => { 149 this.pathStack = context.pathStack; 150 }) 151 } 152} 153``` 154 155每个子页也需要配置到系统配置文件`route_map.json`中(参考[系统路由表](arkts-navigation-navigation.md#系统路由表))。 156 157```json 158// 工程配置文件module.json5中配置 {"routerMap": "$profile:route_map"} 159// route_map.json 160{ 161 "routerMap": [ 162 { 163 "name": "pageOne", 164 "pageSourceFile": "src/main/ets/pages/PageOne.ets", 165 "buildFunction": "PageOneBuilder", 166 "data": { 167 "description": "this is pageOne" 168 } 169 } 170 ] 171} 172``` 173 174## 路由操作 175 176Router通过`@ohos.router`模块提供的方法来操作页面,建议使用[UIContext](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md)中的[getRouter](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md#getrouter)获取[Router](../reference/apis-arkui/arkts-apis-uicontext-router.md)对象。 177 178```ts 179// push page 180router.pushUrl({ url:"pages/pageOne", params: null }); 181 182// pop page 183this.getUIContext().getRouter().back({ url: "pages/pageOne" }); 184 185// replace page 186router.replaceUrl({ url: "pages/pageOne" }); 187 188// clear all page 189this.getUIContext().getRouter().clear(); 190 191// 获取页面栈大小 192let size = this.getUIContext().getRouter().getLength(); 193 194// 获取页面状态 195let pageState = this.getUIContext().getRouter().getState(); 196``` 197 198Navigation通过导航控制器对象[NavPathStack](../reference/apis-arkui/arkui-ts/ts-basic-components-navigation.md#navpathstack10)提供的方法来操作页面,需要创建一个栈对象并传入Navigation中。 199 200```ts 201@Entry 202@Component 203struct Index { 204 pathStack: NavPathStack = new NavPathStack(); 205 206 build() { 207 // 设置NavPathStack并传入Navigation 208 Navigation(this.pathStack) { 209 // ... 210 }.width('100%').height('100%') 211 .title("Navigation") 212 .mode(NavigationMode.Stack) 213 } 214} 215 216 217// push page 218this.pathStack.pushPath({ name: 'pageOne' }); 219 220// pop page 221this.pathStack.pop(); 222this.pathStack.popToIndex(1); 223this.pathStack.popToName('pageOne'); 224 225// replace page 226this.pathStack.replacePath({ name: 'pageOne' }); 227 228// clear all page 229this.pathStack.clear(); 230 231// 获取路由栈大小 232let size: number = this.pathStack.size(); 233 234// 删除栈中name为PageOne的所有页面 235this.pathStack.removeByName("pageOne"); 236 237// 删除指定索引的页面 238this.pathStack.removeByIndexes([1, 3, 5]); 239 240// 获取栈中所有页面name集合 241this.pathStack.getAllPathName(); 242 243// 获取索引为1的页面参数 244this.pathStack.getParamByIndex(1); 245 246// 获取PageOne页面的参数 247this.pathStack.getParamByName("pageOne"); 248 249// 获取PageOne页面的索引集合 250this.pathStack.getIndexByName("pageOne"); 251// ... 252``` 253 254Router作为全局通用模块,可以在任意页面中调用,Navigation作为组件,子页面想要做路由需要拿到Navigation持有的导航控制器对象NavPathStack,可以通过如下几种方式获取: 255 256**方式一**:通过`@Provide`和`@Consume`传递给子页面(有耦合,不推荐)。 257 258```ts 259// Navigation根容器 260@Entry 261@Component 262struct Index { 263 // Navigation创建一个Provide修饰的NavPathStack 264 @Provide('pathStack') pathStack: NavPathStack = new NavPathStack(); 265 266 build() { 267 Navigation(this.pathStack) { 268 // ... 269 } 270 .title("Navigation") 271 .mode(NavigationMode.Stack) 272 } 273} 274 275// Navigation子页面 276@Component 277export struct PageOne { 278 // NavDestination通过Consume获取到 279 @Consume('pathStack') pathStack: NavPathStack; 280 281 build() { 282 NavDestination() { 283 // ... 284 } 285 .title("PageOne") 286 } 287} 288``` 289 290**方式二**:子页面通过`OnReady`回调获取。 291 292```ts 293@Component 294export struct PageOne { 295 pathStack: NavPathStack = new NavPathStack(); 296 297 build() { 298 NavDestination() { 299 // ... 300 }.title('PageOne') 301 .onReady((context: NavDestinationContext) => { 302 this.pathStack = context.pathStack; 303 }) 304 } 305} 306``` 307 308**方式三**: 通过全局的`AppStorage`接口设置获取。 309 310```ts 311@Entry 312@Component 313struct Index { 314 pathStack: NavPathStack = new NavPathStack(); 315 316 // 全局设置一个NavPathStack 317 aboutToAppear(): void { 318 AppStorage.setOrCreate("PathStack", this.pathStack); 319 } 320 321 build() { 322 Navigation(this.pathStack) { 323 // ... 324 }.title("Navigation") 325 .mode(NavigationMode.Stack) 326 } 327} 328 329// Navigation子页面 330@Component 331export struct PageOne { 332 // 子页面中获取全局的NavPathStack 333 pathStack: NavPathStack = AppStorage.get("PathStack") as NavPathStack; 334 335 build() { 336 NavDestination() { 337 // ... 338 } 339 .title("PageOne") 340 } 341} 342``` 343 344**方式四**:通过自定义组件查询接口获取,参考[queryNavigationInfo](../reference/apis-arkui/arkui-ts/ts-custom-component-api.md#querynavigationinfo12)。 345 346```ts 347// 子页面中的自定义组件 348@Component 349struct CustomNode { 350 pathStack: NavPathStack = new NavPathStack(); 351 352 aboutToAppear() { 353 // query navigation info 354 let navigationInfo: NavigationInfo = this.queryNavigationInfo() as NavigationInfo; 355 this.pathStack = navigationInfo.pathStack; 356 } 357 358 build() { 359 Row() { 360 Button('跳转到PageTwo') 361 .onClick(() => { 362 this.pathStack.pushPath({ name: 'pageTwo' }); 363 }) 364 } 365 } 366} 367``` 368 369## 生命周期 370 371> **说明:** 372> 373> router页面的生命周期和Navigation页面的生命周期关系如下: 374> 375> 1.router页面的跳转会影响其内部Navigation页面的生命周期。 376> 377> 2.Navigation页面的跳转不会影响其所在router页面的生命周期。 378> 379> 3.应用前后台切换会同时触发router页面和Navigation页面的生命周期。 380 381Router页面[生命周期](arkts-routing.md#生命周期)为`@Entry`页面中的通用方法,主要有如下四个生命周期: 382 383```ts 384// 页面创建后挂树的回调 385aboutToAppear(): void { 386} 387 388// 页面销毁前下树的回调 389aboutToDisappear(): void { 390} 391 392// 页面显示时的回调 393onPageShow(): void { 394} 395 396// 页面隐藏时的回调 397onPageHide(): void { 398} 399``` 400 401其生命周期时序如下图所示: 402 403 404 405Navigation作为路由容器,其生命周期承载在NavDestination组件上,以组件事件的形式开放。 406具体生命周期描述请参考Navigation[页面生命周期](arkts-navigation-navigation.md#页面生命周期)。 407 408```ts 409@Component 410struct PageOne { 411 aboutToDisappear() { 412 } 413 414 aboutToAppear() { 415 } 416 417 build() { 418 NavDestination() { 419 // ... 420 } 421 .onWillAppear(() => { 422 }) 423 .onAppear(() => { 424 }) 425 .onWillShow(() => { 426 }) 427 .onShown(() => { 428 }) 429 .onWillHide(() => { 430 }) 431 .onHidden(() => { 432 }) 433 .onWillDisappear(() => { 434 }) 435 .onDisAppear(() => { 436 }) 437 } 438} 439``` 440 441## 转场动画 442 443Router和Navigation都提供了系统的转场动画也提供了自定义转场的能力。 444 445其中Router自定义页面转场通过通用方法`pageTransition()`实现,具体可参考Router[页面转场动画](arkts-page-transition-animation.md)。 446 447Navigation作为路由容器组件,其内部的页面切换动画本质上属于组件跟组件之间的属性动画,可以通过Navigation中的[customNavContentTransition](../reference/apis-arkui/arkui-ts/ts-basic-components-navigation.md#customnavcontenttransition11)事件提供自定义转场动画的能力,具体实现可以参考Navigation[自定义转场](arkts-navigation-navigation.md#自定义转场)。(注意:API version 13之前,Dialog类型的页面默认无转场动画。从API version13开始,Dialog类型的页面支持系统转场动画。) 448 449## 共享元素转场 450 451页面和页面之间跳转的时候需要进行共享元素过渡动画,Router可以通过通用属性`sharedTransition`来实现共享元素转场,具体可以参考如下链接: 452[Router共享元素转场动画](../reference/apis-arkui/arkui-ts/ts-transition-animation-shared-elements.md)。 453 454Navigation也提供了共享元素一镜到底的转场能力,需要配合`geometryTransition`属性,在子页面(NavDestination)之间切换时,可以实现共享元素转场,具体可参考[Navigation共享元素转场动画](arkts-navigation-navigation.md#共享元素转场)。 455 456## 跨包路由 457 458Router可以通过命名路由的方式实现跨包跳转。 459 4601. 在想要跳转到的共享包[HAR](../quick-start/har-package.md)或者[HSP](../quick-start/in-app-hsp.md)页面里,给@Entry修饰的自定义组件[EntryOptions](../ui/state-management/arkts-create-custom-components.md#entry)命名。 461 462 ```ts 463 // library/src/main/ets/pages/Index.ets 464 // library为新建共享包自定义的名字 465 @Entry({ routeName: 'myPage' }) 466 @Component 467 export struct MyComponent { 468 build() { 469 Row() { 470 Column() { 471 Text('Library Page') 472 .fontSize(50) 473 .fontWeight(FontWeight.Bold) 474 } 475 .width('100%') 476 } 477 .height('100%') 478 } 479 } 480 ``` 481 4822. 配置成功后需要在跳转的页面中引入命名路由的页面并跳转。 483 484 ```ts 485 import { router } from '@kit.ArkUI'; 486 import { BusinessError } from '@kit.BasicServicesKit'; 487 import('library/src/main/ets/pages/Index'); // 引入共享包中的命名路由页面 488 489 @Entry 490 @Component 491 struct Index { 492 build() { 493 Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { 494 Text('Hello World') 495 .fontSize(50) 496 .fontWeight(FontWeight.Bold) 497 .margin({ top: 20 }) 498 .backgroundColor('#ccc') 499 .onClick(() => { // 点击跳转到其他共享包中的页面 500 try { 501 this.getUIContext().getRouter().pushNamedRoute({ 502 name: 'myPage', 503 params: { 504 data1: 'message', 505 data2: { 506 data3: [123, 456, 789] 507 } 508 } 509 }) 510 } catch (err) { 511 let message = (err as BusinessError).message 512 let code = (err as BusinessError).code 513 console.error(`pushNamedRoute failed, code is ${code}, message is ${message}`); 514 } 515 }) 516 } 517 .width('100%') 518 .height('100%') 519 } 520 } 521 ``` 522 523Navigation作为路由组件,默认支持跨包跳转。 524 5251. 从HSP(HAR)中完成自定义组件(需要跳转的目标页面)开发,将自定义组件申明为export。 526 527 ```ts 528 @Component 529 export struct PageInHSP { 530 build() { 531 NavDestination() { 532 // ... 533 } 534 } 535 } 536 ``` 537 5382. 在HSP(HAR)的Index.ets中导出组件。 539 540 ```ts 541 export { PageInHSP } from "./src/main/ets/pages/PageInHSP" 542 ``` 543 5443. 配置好HSP(HAR)的项目依赖后,在mainPage中导入自定义组件,并添加到pageMap中,即可正常调用。 545 546 ``` 547 // 1.导入跨包的路由页面 548 import { PageInHSP } from 'library/src/main/ets/pages/PageInHSP' 549 550 @Entry 551 @Component 552 struct mainPage { 553 pageStack: NavPathStack = new NavPathStack(); 554 555 @Builder pageMap(name: string) { 556 if (name === 'PageInHSP') { 557 // 2.定义路由映射表 558 PageInHSP(); 559 } 560 } 561 562 build() { 563 Navigation(this.pageStack) { 564 Button("Push HSP Page") 565 .onClick(() => { 566 // 3.跳转到Hsp中的页面 567 this.pageStack.pushPath({ name: "PageInHSP" }); 568 }) 569 } 570 .mode(NavigationMode.Stack) 571 .navDestination(this.pageMap) 572 } 573 } 574 ``` 575 576以上是通过**静态依赖**的形式完成了跨包的路由,在大型的项目中一般跨模块的开发需要解耦,那就需要依赖动态路由的能力。 577 578## 动态路由 579 580动态路由设计的目的是解决多个产品(Hap)之间可以复用相同的业务模块,各个业务模块之间解耦(模块之间跳转通过路由表跳转,不需要互相依赖)和路由功能扩展整合。 581 582业务特性模块对外暴露的就是模块内支持完成具体业务场景的多个页面的集合;路由管理就是将每个模块支持的页面都用统一的路由表结构管理起来。 当产品需要某个业务模块时,就会注册对应的模块的路由表。 583 584**动态路由的优势:** 585 5861. 路由定义除了跳转的URL以外,可以丰富的配置任意扩展信息,如横竖屏默认模式,是否需要鉴权等等,做路由跳转时的统一处理。 5872. 给每个路由设置一个名字,按照名称进行跳转而不是ets文件路径。 5883. 页面的加载可以使用动态Import(按需加载),防止首个页面加载大量代码导致卡顿。 589 590**Router实现动态路由主要有下面三个过程:** 591 5921. 定义过程: 路由表定义新增路由 -> 页面文件绑定路由名称(装饰器) -> 加载函数和页面文件绑定(动态import函数)<br> 5932. 定义注册过程: 路由注册(可在入口ability中按需注入依赖模块的路由表)。<br> 5943. 跳转过程: 路由表检查(是否注册过对应路由名称) -> 路由前置钩子(路由页面加载-动态Import) -> 路由跳转 -> 路由后置钩子(公共处理,如打点)。 595 596**Navigation实现动态路由有如下两种实现方案:** 597 598**方案一:** 自定义路由表 599 600基本实现跟上述Router动态路由类似。 6011. 开发者自定义路由管理模块,各个提供路由页面的模块均依赖此模块; 6022. 构建Navigation组件时,将NavPathStack注入路由管理模块,路由管理模块对NavPathStack进行封装,对外提供路由能力; 6033. 各个路由页面不再提供组件,转为提供@build封装的构建函数,并再通过WrappedBuilder封装后,实现全局封装; 6044. 各个路由页面将模块名称、路由名称、WrappedBuilder封装后构建函数注册如路由模块; 6055. 当路由需要跳转到指定路由时,路由模块完成对指定路由模块的动态导入,并完成路由跳转。 606 607具体的构建过程,可以参考Navigation[自动生成动态路由](https://gitee.com/harmonyos-cases/cases/blob/master/CommonAppDevelopment/common/routermodule/README_AUTO_GENERATE.md)示例。 608 609**方案二:** 系统路由表 610 611从API version 12版本开始,Navigation支持系统跨模块的路由表方案,整体设计是将路由表方案下沉到系统中管理,即在需要路由的各个业务模块(HSP/HAR)中独立配置`router_map.json`文件,在触发路由跳转时,应用只需要通过`NavPathStack`进行路由跳转,此时系统会自动完成路由模块的动态加载、组件构建,并完成路由跳转功能,从而实现了开发层面的模块解耦。 612具体可参考Navigation[系统路由表](arkts-navigation-navigation.md#系统路由表)。 613 614## 生命周期监听 615 616Router可以通过observer实现注册监听,接口定义请参考Router无感监听[observer.on('routerPageUpdate')](../reference/apis-arkui/js-apis-arkui-observer.md#uiobserveronrouterpageupdate11)。 617 618 619```ts 620import { uiObserver } from '@kit.ArkUI'; 621 622function callbackFunc(info: uiObserver.RouterPageInfo) { 623 console.info("RouterPageInfo is : " + JSON.stringify(info)); 624} 625 626// used in ability context. 627uiObserver.on('routerPageUpdate', this.context, callbackFunc); 628 629// used in UIContext. 630uiObserver.on('routerPageUpdate', this.getUIContext(), callbackFunc); 631``` 632 633在页面状态发生变化时,注册的回调将会触发,开发者可以通过回调中传入的入参拿到页面的相关信息,如:页面的名字,索引,路径,生命周期状态等。 634 635Navigation同样可以通过在observer中实现注册监听。 636 637```ts 638// EntryAbility.ets 639import { BusinessError } from '@kit.BasicServicesKit'; 640import { UIObserver } from '@kit.ArkUI'; 641 642export default class EntryAbility extends UIAbility { 643 // ... 644 onWindowStageCreate(windowStage: window.WindowStage): void { 645 // ... 646 windowStage.getMainWindow((err: BusinessError, data) => { 647 // ... 648 let windowClass = data; 649 // 获取UIContext实例。 650 let uiContext: UIContext = windowClass.getUIContext(); 651 // 获取UIObserver实例。 652 let uiObserver : UIObserver = uiContext.getUIObserver(); 653 // 注册DevNavigation的状态监听. 654 uiObserver.on("navDestinationUpdate",(info) => { 655 // NavDestinationState.ON_SHOWN = 0, NavDestinationState.ON_HIDE = 1 656 if (info.state == 0) { 657 // NavDestination组件显示时操作 658 console.info('page ON_SHOWN:' + info.name.toString()); 659 } 660 }) 661 }) 662 } 663} 664``` 665 666## 页面信息查询 667 668为了实现页面内自定义组件跟页面解耦,自定义组件中提供了全局查询页面信息的接口。 669 670Router可以通过[queryRouterPageInfo](../reference/apis-arkui/arkui-ts/ts-custom-component-api.md#queryrouterpageinfo12)接口查询当前自定义组件所在的Page页面的信息,其返回值包含如下几个属性,其中pageId是页面的唯一标识符: 671 672| 名称 | 类型 | 必填 | 说明 | 673| -------------------- | --------------------------- | ---- | ------------------------------ | 674| context | UIAbilityContext/ UIContext | 是 | routerPage页面对应的上下文信息。 | 675| index | number | 是 | routerPage在栈中的位置。 | 676| name | string | 是 | routerPage页面的名称。 | 677| path | string | 是 | routerPage页面的路径。 | 678| state | RouterPageState | 是 | routerPage页面的状态。 | 679| pageId<sup>12+</sup> | string | 是 | routerPage页面的唯一标识。 | 680 681```ts 682import { uiObserver } from '@kit.ArkUI'; 683 684// 页面内的自定义组件 685@Component 686struct MyComponent { 687 aboutToAppear() { 688 let info: uiObserver.RouterPageInfo | undefined = this.queryRouterPageInfo(); 689 } 690 691 build() { 692 // ... 693 } 694} 695``` 696 697Navigation也可以通过[queryNavDestinationInfo](../reference/apis-arkui/arkui-ts/ts-custom-component-api.md#querynavdestinationinfo)接口查询当前自定义组件所在的NavDestination的信息,其返回值包含如下几个属性,其中navDestinationId是页面的唯一标识符: 698 699| 名称 | 类型 | 必填 | 说明 | 700| ----------------------------- | ------------------- | ---- | -------------------------------------------- | 701| navigationId | ResourceStr | 是 | 包含NavDestination组件的Navigation组件的id。 | 702| name | ResourceStr | 是 | NavDestination组件的名称。 | 703| state | NavDestinationState | 是 | NavDestination组件的状态。 | 704| index<sup>12+<sup> | number | 是 | NavDestination在路由栈中的索引。 | 705| param<sup>12+<sup> | Object | 否 | NavDestination组件的参数。 | 706| navDestinationId<sup>12+<sup> | string | 是 | NavDestination组件的唯一标识ID。 | 707 708```ts 709import { uiObserver } from '@kit.ArkUI'; 710 711@Component 712export struct NavDestinationExample { 713 build() { 714 NavDestination() { 715 MyComponent(); 716 } 717 } 718} 719 720@Component 721struct MyComponent { 722 navDesInfo: uiObserver.NavDestinationInfo | undefined 723 724 aboutToAppear() { 725 this.navDesInfo = this.queryNavDestinationInfo(); 726 console.log('get navDestinationInfo: ' + JSON.stringify(this.navDesInfo)) 727 } 728 729 build() { 730 // ... 731 } 732} 733``` 734 735## 路由拦截 736 737Router没有提供路由拦截的能力,开发者需要自行封装路由跳转接口,并在自己封装的接口中做路由拦截的判断并重定向路由。 738 739Navigation提供了[setInterception](../reference/apis-arkui/arkui-ts/ts-basic-components-navigation.md#setinterception12)方法,用于设置Navigation页面跳转拦截回调。具体可以参考文档:Navigation[路由拦截](arkts-navigation-navigation.md#路由拦截)