• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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![image](figures/router_page_lifecycle.png)
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#路由拦截)