• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.router (页面路由)
2
3本模块提供通过不同的url访问不同的页面,包括跳转到应用内的指定页面、用应用内的某个页面替换当前页面、返回上一页面或指定的页面等。
4
5> **说明**
6>
7> - 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8>
9> - 页面路由需要在页面渲染完成之后才能调用,在onInit和onReady生命周期中页面还处于渲染阶段,禁止调用页面路由方法。
10
11## 导入模块
12
13```
14import router from '@ohos.router'
15```
16
17## router.pushUrl<sup>9+</sup>
18
19pushUrl(options: RouterOptions): Promise&lt;void&gt;
20
21跳转到应用内的指定页面。
22
23**系统能力:** SystemCapability.ArkUI.ArkUI.Full
24
25**参数:**
26
27| 参数名     | 类型                              | 必填   | 说明        |
28| ------- | ------------------------------- | ---- | --------- |
29| options | [RouterOptions](#routeroptions) | 是    | 跳转页面描述信息。 |
30
31**返回值:**
32
33| 类型                | 说明        |
34| ------------------- | --------- |
35| Promise&lt;void&gt; | 异常返回结果。 |
36
37**错误码:**
38
39以下错误码的详细介绍请参见[ohos.router(页面路由)](../errorcodes/errorcode-router.md)错误码。
40
41| 错误码ID   | 错误信息 |
42| --------- | ------- |
43| 100001    | if UI execution context not found. |
44| 100002    | if the uri is not exist. |
45| 100003    | if the pages are pushed too much. |
46
47**示例:**
48
49```js
50router.pushUrl({
51  url: 'pages/routerpage2',
52  params: {
53    data1: 'message',
54    data2: {
55      data3: [123, 456, 789]
56    }
57  }
58})
59  .then(() => {
60    // success
61  })
62  .catch(err => {
63    console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);
64  })
65```
66
67## router.pushUrl<sup>9+</sup>
68
69pushUrl(options: RouterOptions, callback: AsyncCallback&lt;void&gt;): void
70
71跳转到应用内的指定页面。
72
73**系统能力:** SystemCapability.ArkUI.ArkUI.Full
74
75**参数:**
76
77| 参数名     | 类型                              | 必填   | 说明        |
78| ------- | ------------------------------- | ---- | --------- |
79| options | [RouterOptions](#routeroptions) | 是    | 跳转页面描述信息。 |
80| callback | AsyncCallback&lt;void&gt;      | 是   | 异常响应回调。   |
81
82**错误码:**
83
84以下错误码的详细介绍请参见[ohos.router(页面路由)](../errorcodes/errorcode-router.md)错误码。
85
86| 错误码ID   | 错误信息 |
87| --------- | ------- |
88| 100001    | if UI execution context not found. |
89| 100002    | if the uri is not exist. |
90| 100003    | if the pages are pushed too much. |
91
92**示例:**
93
94```js
95router.pushUrl({
96  url: 'pages/routerpage2',
97  params: {
98    data1: 'message',
99    data2: {
100      data3: [123, 456, 789]
101    }
102  }
103}, (err) => {
104  if (err) {
105    console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);
106    return;
107  }
108  console.info('pushUrl success');
109});
110```
111## router.pushUrl<sup>9+</sup>
112
113pushUrl(options: RouterOptions, mode: RouterMode): Promise&lt;void&gt;
114
115跳转到应用内的指定页面。
116
117**系统能力:** SystemCapability.ArkUI.ArkUI.Full
118
119**参数:**
120
121| 参数名     | 类型                              | 必填   | 说明         |
122| ------- | ------------------------------- | ---- | ---------- |
123| options | [RouterOptions](#routeroptions) | 是    | 跳转页面描述信息。  |
124| mode    | [RouterMode](#routermode9)      | 是    | 跳转页面使用的模式。 |
125
126**返回值:**
127
128| 类型                | 说明        |
129| ------------------- | --------- |
130| Promise&lt;void&gt; | 异常返回结果。 |
131
132**错误码:**
133
134以下错误码的详细介绍请参见[ohos.router(页面路由)](../errorcodes/errorcode-router.md)错误码。
135
136| 错误码ID   | 错误信息 |
137| --------- | ------- |
138| 100001    | if UI execution context not found. |
139| 100002    | if the uri is not exist. |
140| 100003    | if the pages are pushed too much. |
141
142**示例:**
143
144```js
145router.pushUrl({
146  url: 'pages/routerpage2',
147  params: {
148    data1: 'message',
149    data2: {
150      data3: [123, 456, 789]
151    }
152  }
153}, router.RouterMode.Standard)
154  .then(() => {
155    // success
156  })
157  .catch(err => {
158    console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);
159  })
160```
161
162## router.pushUrl<sup>9+</sup>
163
164pushUrl(options: RouterOptions, mode: RouterMode, callback: AsyncCallback&lt;void&gt;): void
165
166跳转到应用内的指定页面。
167
168**系统能力:** SystemCapability.ArkUI.ArkUI.Full
169
170**参数:**
171
172| 参数名     | 类型                              | 必填   | 说明         |
173| ------- | ------------------------------- | ---- | ---------- |
174| options | [RouterOptions](#routeroptions) | 是    | 跳转页面描述信息。  |
175| mode    | [RouterMode](#routermode9)      | 是    | 跳转页面使用的模式。 |
176| callback | AsyncCallback&lt;void&gt;      | 是   | 异常响应回调。    |
177
178**错误码:**
179
180以下错误码的详细介绍请参见[ohos.router(页面路由)](../errorcodes/errorcode-router.md)错误码。
181
182| 错误码ID   | 错误信息 |
183| --------- | ------- |
184| 100001    | if UI execution context not found. |
185| 100002    | if the uri is not exist. |
186| 100003    | if the pages are pushed too much. |
187
188**示例:**
189
190```js
191router.pushUrl({
192  url: 'pages/routerpage2',
193  params: {
194    data1: 'message',
195    data2: {
196      data3: [123, 456, 789]
197    }
198  }
199}, router.RouterMode.Standard, (err) => {
200  if (err) {
201    console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);
202    return;
203  }
204  console.info('pushUrl success');
205});
206```
207
208## router.replaceUrl<sup>9+</sup>
209
210replaceUrl(options: RouterOptions): Promise&lt;void&gt;
211
212用应用内的某个页面替换当前页面,并销毁被替换的页面。
213
214**系统能力:** SystemCapability.ArkUI.ArkUI.Lite
215
216**参数:**
217
218| 参数名  | 类型                            | 必填 | 说明               |
219| ------- | ------------------------------- | ---- | ------------------ |
220| options | [RouterOptions](#routeroptions) | 是   | 替换页面描述信息。 |
221
222**返回值:**
223
224| 类型                | 说明        |
225| ------------------- | --------- |
226| Promise&lt;void&gt; | 异常返回结果。 |
227
228**错误码:**
229
230以下错误码的详细介绍请参见[ohos.router(页面路由)](../errorcodes/errorcode-router.md)错误码。
231
232| 错误码ID   | 错误信息 |
233| --------- | ------- |
234| 100001    | if UI execution context not found, only throw in standard system. |
235| 200002    | if the uri is not exist. |
236
237**示例:**
238
239```js
240router.replaceUrl({
241  url: 'pages/detail',
242  params: {
243    data1: 'message'
244  }
245})
246  .then(() => {
247    // success
248  })
249  .catch(err => {
250    console.error(`replaceUrl failed, code is ${err.code}, message is ${err.message}`);
251  })
252```
253
254## router.replaceUrl<sup>9+</sup>
255
256replaceUrl(options: RouterOptions, callback: AsyncCallback&lt;void&gt;): void
257
258用应用内的某个页面替换当前页面,并销毁被替换的页面。
259
260**系统能力:** SystemCapability.ArkUI.ArkUI.Lite
261
262**参数:**
263
264| 参数名  | 类型                            | 必填 | 说明               |
265| ------- | ------------------------------- | ---- | ------------------ |
266| options | [RouterOptions](#routeroptions) | 是   | 替换页面描述信息。 |
267| callback | AsyncCallback&lt;void&gt;      | 是   | 异常响应回调。    |
268
269**错误码:**
270
271以下错误码的详细介绍请参见[ohos.router(页面路由)](../errorcodes/errorcode-router.md)错误码。
272
273| 错误码ID   | 错误信息 |
274| --------- | ------- |
275| 100001    | if UI execution context not found, only throw in standard system. |
276| 200002    | if the uri is not exist. |
277
278**示例:**
279
280```js
281router.replaceUrl({
282  url: 'pages/detail',
283  params: {
284    data1: 'message'
285  }
286}, (err) => {
287  if (err) {
288    console.error(`replaceUrl failed, code is ${err.code}, message is ${err.message}`);
289    return;
290  }
291  console.info('replaceUrl success');
292});
293```
294
295## router.replaceUrl<sup>9+</sup>
296
297replaceUrl(options: RouterOptions, mode: RouterMode): Promise&lt;void&gt;
298
299用应用内的某个页面替换当前页面,并销毁被替换的页面。
300
301**系统能力:** SystemCapability.ArkUI.ArkUI.Lite
302
303**参数:**
304
305| 参数名     | 类型                              | 必填   | 说明         |
306| ------- | ------------------------------- | ---- | ---------- |
307| options | [RouterOptions](#routeroptions) | 是    | 替换页面描述信息。  |
308| mode    | [RouterMode](#routermode9)      | 是    | 跳转页面使用的模式。 |
309
310
311**返回值:**
312
313| 类型                | 说明        |
314| ------------------- | --------- |
315| Promise&lt;void&gt; | 异常返回结果。 |
316
317**错误码:**
318
319以下错误码的详细介绍请参见[ohos.router(页面路由)](../errorcodes/errorcode-router.md)错误码。
320
321| 错误码ID   | 错误信息 |
322| --------- | ------- |
323| 100001    | if can not get the delegate, only throw in standard system. |
324| 200002    | if the uri is not exist. |
325
326**示例:**
327
328```js
329router.replaceUrl({
330  url: 'pages/detail',
331  params: {
332    data1: 'message'
333  }
334}, router.RouterMode.Standard)
335  .then(() => {
336    // success
337  })
338  .catch(err => {
339    console.error(`replaceUrl failed, code is ${err.code}, message is ${err.message}`);
340  })
341```
342
343## router.replaceUrl<sup>9+</sup>
344
345replaceUrl(options: RouterOptions, mode: RouterMode, callback: AsyncCallback&lt;void&gt;): void
346
347用应用内的某个页面替换当前页面,并销毁被替换的页面。
348
349**系统能力:** SystemCapability.ArkUI.ArkUI.Lite
350
351**参数:**
352
353| 参数名     | 类型                              | 必填   | 说明         |
354| ------- | ------------------------------- | ---- | ---------- |
355| options | [RouterOptions](#routeroptions) | 是    | 替换页面描述信息。  |
356| mode    | [RouterMode](#routermode9)      | 是    | 跳转页面使用的模式。 |
357| callback | AsyncCallback&lt;void&gt;      | 是   | 异常响应回调。  |
358
359**错误码:**
360
361以下错误码的详细介绍请参见[ohos.router(页面路由)](../errorcodes/errorcode-router.md)错误码。
362
363| 错误码ID   | 错误信息 |
364| --------- | ------- |
365| 100001    | if UI execution context not found, only throw in standard system. |
366| 200002    | if the uri is not exist. |
367
368**示例:**
369
370```js
371router.replaceUrl({
372  url: 'pages/detail',
373  params: {
374    data1: 'message'
375  }
376}, router.RouterMode.Standard, (err) => {
377  if (err) {
378    console.error(`replaceUrl failed, code is ${err.code}, message is ${err.message}`);
379    return;
380  }
381  console.info('replaceUrl success');
382});
383```
384
385## router.back
386
387back(options?: RouterOptions ): void
388
389返回上一页面或指定的页面。
390
391**系统能力:** SystemCapability.ArkUI.ArkUI.Full
392
393**参数:**
394
395| 参数名  | 类型                            | 必填 | 说明                                                         |
396| ------- | ------------------------------- | ---- | ------------------------------------------------------------ |
397| options | [RouterOptions](#routeroptions) | 否   | 返回页面描述信息,其中参数url指路由跳转时会返回到指定url的界面,如果页面栈上没有url页面,则不响应该情况。如果url未设置,则返回上一页,页面不会重新构建,页面栈里面的page不会回收,出栈后会被回收。 |
398
399**示例:**
400
401```js
402router.back({url:'pages/detail'});
403```
404
405## router.clear
406
407clear(): void
408
409清空页面栈中的所有历史页面,仅保留当前页面作为栈顶页面。
410
411**系统能力:** SystemCapability.ArkUI.ArkUI.Full
412
413**示例:**
414
415```js
416router.clear();
417```
418
419## router.getLength
420
421getLength(): string
422
423获取当前在页面栈内的页面数量。
424
425**系统能力:** SystemCapability.ArkUI.ArkUI.Full
426
427**返回值:**
428
429| 类型     | 说明                 |
430| ------ | ------------------ |
431| string | 页面数量,页面栈支持最大数值是32。 |
432
433**示例:**
434
435```js
436let size = router.getLength();
437console.log('pages stack size = ' + size);
438```
439
440## router.getState
441
442getState(): RouterState
443
444获取当前页面的状态信息。
445
446**系统能力:** SystemCapability.ArkUI.ArkUI.Full
447
448**返回值:**
449
450| 类型                          | 说明      |
451| --------------------------- | ------- |
452| [RouterState](#routerstate) | 页面状态信息。 |
453
454**示例:**
455
456```js
457let page = router.getState();
458console.log('current index = ' + page.index);
459console.log('current name = ' + page.name);
460console.log('current path = ' + page.path);
461```
462
463## RouterState
464
465页面状态信息。
466
467**系统能力:** SystemCapability.ArkUI.ArkUI.Full468
469| 名称  | 类型   | 必填 | 说明                                                         |
470| ----- | ------ | ---- | ------------------------------------------------------------ |
471| index | number | 是   | 表示当前页面在页面栈中的索引。从栈底到栈顶,index从1开始递增。 |
472| name  | string | 否   | 表示当前页面的名称,即对应文件名。                           |
473| path  | string | 是   | 表示当前页面的路径。                                         |
474
475## router.showAlertBeforeBackPage<sup>9+</sup>
476
477showAlertBeforeBackPage(options: EnableAlertOptions): void
478
479开启页面返回询问对话框。
480
481**系统能力:** SystemCapability.ArkUI.ArkUI.Full
482
483**参数:**
484
485| 参数名     | 类型                                       | 必填   | 说明        |
486| ------- | ---------------------------------------- | ---- | --------- |
487| options | [EnableAlertOptions](#enablealertoptions) | 是    | 文本弹窗信息描述。 |
488
489**错误码:**
490
491以下错误码的详细介绍请参见[ohos.router(页面路由)](../errorcodes/errorcode-router.md)错误码。
492
493| 错误码ID   | 错误信息 |
494| --------- | ------- |
495| 100001    | if UI execution context not found. |
496
497**示例:**
498
499  ```js
500try {
501  router.showAlertBeforeBackPage({
502    message: 'Message Info'
503  });
504} catch(error) {
505  console.error(`showAlertBeforeBackPage failed, code is ${error.code}, message is ${error.message}`);
506}
507  ```
508## EnableAlertOptions
509
510页面返回询问对话框选项。
511
512**系统能力:** 以下各项对应的系统能力均为SystemCapability.ArkUI.ArkUI.Full513
514| 名称      | 类型     | 必填   | 说明       |
515| ------- | ------ | ---- | -------- |
516| message | string | 是    | 询问对话框内容。 |
517
518## router.hideAlertBeforeBackPage<sup>9+</sup>
519
520hideAlertBeforeBackPage(): void
521
522禁用页面返回询问对话框。
523
524**系统能力:** SystemCapability.ArkUI.ArkUI.Full
525
526**示例:**
527
528```js
529router.hideAlertBeforeBackPage();
530```
531
532##  router.getParams
533
534getParams(): Object
535
536获取发起跳转的页面往当前页传入的参数。
537
538**系统能力:** SystemCapability.ArkUI.ArkUI.Full
539
540**返回值:**
541
542| 类型   | 说明                               |
543| ------ | ---------------------------------- |
544| object | 发起跳转的页面往当前页传入的参数。 |
545
546**示例:**
547
548```
549router.getParams();
550```
551
552## RouterOptions
553
554路由跳转选项。
555
556**系统能力:** SystemCapability.ArkUI.ArkUI.Lite557
558| 名称   | 类型   | 必填 | 说明                                                         |
559| ------ | ------ | ---- | ------------------------------------------------------------ |
560| url    | string | 是   | 表示目标页面的url,可以用以下两种格式:<br/>-&nbsp;页面绝对路径,由配置文件中pages列表提供,例如:<br/>&nbsp;&nbsp;-&nbsp;pages/index/index<br/>&nbsp;&nbsp;-&nbsp;pages/detail/detail<br/>-&nbsp;特殊值,如果url的值是"/",则跳转到首页。 |
561| params | object | 否   | 表示路由跳转时要同时传递到目标页面的数据。跳转到目标页面后,使用router.getParams()获取传递的参数,此外,在类web范式中,参数也可以在页面中直接使用,如this.keyValue(keyValue为跳转时params参数中的key值),如果目标页面中已有该字段,则其值会被传入的字段值覆盖。 |
562
563
564  > **说明:**
565  > 页面路由栈支持的最大Page数量为32。
566
567## RouterMode<sup>9+</sup>
568
569路由跳转模式。
570
571**系统能力:** SystemCapability.ArkUI.ArkUI.Full572
573| 名称     | 说明                                                         |
574| -------- | ------------------------------------------------------------ |
575| Standard | 多实例模式,也是默认情况下的跳转模式。 <br/>目标页面会被添加到页面栈顶,无论栈中是否存在相同url的页面。<br/>**说明:**不使用路由跳转模式时,则按照默认的多实例模式进行跳转。 |
576| Single   | 单实例模式。<br/>如果目标页面的url已经存在于页面栈中,则会将离栈顶最近的同url页面移动到栈顶,该页面成为新建页。<br />如果目标页面的url在页面栈中不存在同url页面,则按照默认的多实例模式进行跳转。 |
577
578## 完整示例
579
580### 基于JS扩展的类Web开发范式
581
582```js
583// 在当前页面中
584export default {
585  pushPage() {
586    router.push({
587      url: 'pages/detail/detail',
588      params: {
589        data1: 'message'
590      }
591    });
592  }
593}
594```
595```js
596// 在detail页面中
597export default {
598  onInit() {
599    console.info('showData1:' + router.getParams()['data1']);
600  }
601}
602```
603
604### 基于TS扩展的声明式开发范式
605
606```ts
607// 通过router.pushUrl跳转至目标页携带params参数
608import router from '@ohos.router'
609
610@Entry
611@Component
612struct Index {
613  async  routePage() {
614    let options = {
615      url: 'pages/second',
616      params: {
617        text: '这是第一页的值',
618        data: {
619          array: [12, 45, 78]
620        }
621      }
622    }
623    try {
624      await router.pushUrl(options)
625    } catch (err) {
626      console.info(` fail callback, code: ${err.code}, msg: ${err.msg}`)
627    }
628  }
629
630  build() {
631    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
632      Text('这是第一页')
633        .fontSize(50)
634        .fontWeight(FontWeight.Bold)
635      Button() {
636        Text('next page')
637          .fontSize(25)
638          .fontWeight(FontWeight.Bold)
639      }.type(ButtonType.Capsule)
640      .margin({ top: 20 })
641      .backgroundColor('#ccc')
642      .onClick(() => {
643        this.routePage()
644      })
645    }
646    .width('100%')
647    .height('100%')
648  }
649}
650```
651
652```ts
653// 在second页面中接收传递过来的参数
654import router from '@ohos.router'
655
656@Entry
657@Component
658struct Second {
659  private content: string = "这是第二页"
660  @State text: string = router.getParams()['text']
661  @State data: object = router.getParams()['data']
662  @State secondData: string = ''
663
664  build() {
665    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
666      Text(`${this.content}`)
667        .fontSize(50)
668        .fontWeight(FontWeight.Bold)
669      Text(this.text)
670        .fontSize(30)
671        .onClick(() => {
672          this.secondData = (this.data.['array'][1]).toString()
673        })
674        .margin({ top: 20 })
675      Text(`第一页传来的数值:${this.secondData}`)
676        .fontSize(20)
677        .margin({ top: 20 })
678        .backgroundColor('red')
679    }
680    .width('100%')
681    .height('100%')
682  }
683}
684```
685
686## router.push<sup>(deprecated)</sup>
687
688push(options: RouterOptions): void
689
690跳转到应用内的指定页面。
691
692从API version9开始不再维护,建议使用[pushUrl<sup>9+</sup>](#routerpushurl9)
693
694**系统能力:** SystemCapability.ArkUI.ArkUI.Full
695
696**参数:**
697
698| 参数名     | 类型                              | 必填   | 说明        |
699| ------- | ------------------------------- | ---- | --------- |
700| options | [RouterOptions](#routeroptions) | 是    | 跳转页面描述信息。 |
701
702
703**示例:**
704
705```js
706router.push({
707  url: 'pages/routerpage2',
708  params: {
709    data1: 'message',
710    data2: {
711      data3: [123, 456, 789]
712    }
713  }
714});
715```
716
717## router.replace<sup>(deprecated)</sup>
718
719replace(options: RouterOptions): void
720
721用应用内的某个页面替换当前页面,并销毁被替换的页面。
722
723从API version9开始不再维护,建议使用[replaceUrl<sup>9+</sup>](#routerreplaceurl9)
724
725**系统能力:** SystemCapability.ArkUI.ArkUI.Lite
726
727**参数:**
728
729| 参数名  | 类型                            | 必填 | 说明               |
730| ------- | ------------------------------- | ---- | ------------------ |
731| options | [RouterOptions](#routeroptions) | 是   | 替换页面描述信息。 |
732
733**示例:**
734
735```js
736router.replace({
737  url: 'pages/detail',
738  params: {
739    data1: 'message'
740  }
741});
742```
743
744## router.enableAlertBeforeBackPage<sup>(deprecated)</sup>
745
746enableAlertBeforeBackPage(options: EnableAlertOptions): void
747
748开启页面返回询问对话框。
749
750从API version9开始不再维护,建议使用[showAlertBeforeBackPage<sup>9+</sup>](#routershowalertbeforebackpage9)
751
752**系统能力:** SystemCapability.ArkUI.ArkUI.Full
753
754**参数:**
755
756| 参数名     | 类型                                       | 必填   | 说明        |
757| ------- | ---------------------------------------- | ---- | --------- |
758| options | [EnableAlertOptions](#enablealertoptions) | 是    | 文本弹窗信息描述。 |
759
760**示例:**
761
762  ```js
763  router.enableAlertBeforeBackPage({
764    message: 'Message Info'
765  });
766  ```
767
768## router.disableAlertBeforeBackPage<sup>(deprecated)</sup>
769
770disableAlertBeforeBackPage(): void
771
772禁用页面返回询问对话框。
773
774从API version9开始不再维护,建议使用[hideAlertBeforeBackPage<sup>9+</sup>](#routerhidealertbeforebackpage9)
775
776**系统能力:** SystemCapability.ArkUI.ArkUI.Full
777
778**示例:**
779
780```js
781router.disableAlertBeforeBackPage();
782```