HarmonyOS Next开发学习手册——页面路由 (@ohos.router)

页面路由指在应用程序中实现不同页面之间的跳转和数据传递。Router模块通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。本文将从 页面跳转 、页面返回 、 页面返回前增加一个询问框 和 命名路由 几个方面介绍Router模块提供的功能。

Router适用于 模块间与模块内页面切换,通过每个页面的url实现模块间解耦。模块内页面跳转时,为了实现更好的转场动效场景不建议使用该模块,推荐使用 Navigation 。

页面跳转

页面跳转是开发过程中的一个重要组成部分。在使用应用程序时,通常需要在不同的页面之间跳转,有时还需要将数据从一个页面传递到另一个页面。

图1 页面跳转

Router模块提供了两种跳转模式,分别是 router.pushUrl() 和 router.replaceUrl() 。这两种模式决定了目标页面是否会替换当前页。

  • router.pushUrl():目标页面不会替换当前页,而是压入页面栈。这样可以保留当前页的状态,并且可以通过返回键或者调用 router.back() 方法返回到当前页。

  • router.replaceUrl():目标页面会替换当前页,并销毁当前页。这样可以释放当前页的资源,并且无法返回到当前页。

说明

  • 创建新页面时,请参考 构建第二个页面 配置第二个页面的路由。

  • 页面栈的最大容量为32个页面。如果超过这个限制,可以调用 router.clear() 方法清空历史页面栈,释放内存空间。

同时,Router模块提供了两种实例模式,分别是Standard和Single。这两种模式决定了目标url是否会对应多个实例。

  • Standard:多实例模式,也是默认情况下的跳转模式。目标页面会被添加到页面栈顶,无论栈中是否存在相同url的页面。

  • Single:单实例模式。如果目标页面的url已经存在于页面栈中,则会将离栈顶最近的同url页面移动到栈顶,该页面成为新建页。如果目标页面的url在页面栈中不存在同url页面,则按照默认的多实例模式进行跳转。

在使用Router相关功能之前,需要在代码中先导入Router模块。

import router from '@ohos.router';
import { BusinessError } from '@ohos.base';
import promptAction from '@ohos.promptAction';
  • 场景一:有一个主页(Home)和一个详情页(Detail),希望从主页点击一个商品,跳转到详情页。同时,需要保留主页在页面栈中,以便返回时恢复状态。这种场景下,可以使用pushUrl()方法,并且使用Standard实例模式(或者省略)。
import router from '@ohos.router';
// 在Home页面中
function onJumpClick(): void {
  router.pushUrl({
    url: 'pages/Detail' // 目标url
  }, router.RouterMode.Standard, (err) => {
    if (err) {
      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke pushUrl succeeded.');
  });
}

说明
多实例模式下,router.RouterMode.Standard参数可以省略。

  • 场景二:有一个登录页(Login)和一个个人中心页(Profile),希望从登录页成功登录后,跳转到个人中心页。同时,销毁登录页,在返回时直接退出应用。这种场景下,可以使用replaceUrl()方法,并且使用Standard实例模式(或者省略)。
import router from '@ohos.router';
// 在Login页面中
function onJumpClick(): void {
  router.replaceUrl({
    url: 'pages/Profile' // 目标url
  }, router.RouterMode.Standard, (err) => {
    if (err) {
      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke replaceUrl succeeded.');
  })
}

说明
多实例模式下,router.RouterMode.Standard参数可以省略。

  • 场景三:有一个设置页(Setting)和一个主题切换页(Theme),希望从设置页点击主题选项,跳转到主题切换页。同时,需要保证每次只有一个主题切换页存在于页面栈中,在返回时直接回到设置页。这种场景下,可以使用pushUrl()方法,并且使用Single实例模式。
import router from '@ohos.router';
// 在Setting页面中
function onJumpClick(): void {
  router.pushUrl({
    url: 'pages/Theme' // 目标url
  }, router.RouterMode.Single, (err) => {
    if (err) {
      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke pushUrl succeeded.');
  });
}
    <
### '@ohos.router' 模块 #### 功能 `@ohos.router` 模块主要用于实现页面路由功能,可在应用的不同页面之间进行导航,包括跳转到指定页面、返回上一个页面等操作。 #### 导入说明 在代码中导入该模块使用如下语句: ```typescript import router from '@ohos.router' ``` #### 使用示例 在引用[2]中展示了其使用方式,点击按钮时,调用 `promptAction.showDialog()` 方法进行确认提示,若用户点击“确认”按钮,则调用 `router.back()` 方法返回上一个页面: ```typescript import router from '@ohos.router' import promptAction from '@ohos.promptAction' @Entry @Component struct HomePage { @State message: string = 'Home' @State params:any = router.getParams() build() { Row() { Column({space:6}) { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) Text('接收login传递的id:' + this.params.id) .fontSize(30) .fontWeight(FontWeight.Bold) Button('返回到login页面') .fontSize(20) .onClick(() => { promptAction.showDialog({ message:'确定返回到login页面吗?', buttons: [ { text: '取消', color: '#FF0000' }, { text: '确认', color: '#0099FF' } ] }).then((result)=>{ if(result.index === 0){ // 用户点击了“取消”按钮 console.log('点击了取消按钮') } else if(result.index === 1){ // 用户点击了“确认”按钮 console.log('用户点击了“确认”按钮') // 调用router.back()方法,返回上一个页面 router.back(); } }).catch(err => { console.error(`Invoke showDialog failed, code is ${err.code}, message is ${err.message}`); }) }) } .width('100%') } .height('100%') } } ``` ### '@ohos.promptAction' 模块 #### 功能 `@ohos.promptAction` 模块用于在应用中弹出提示框,向用户展示信息或获取用户的确认信息,支持简单的消息提示和带有确认、取消等选项的对话框。 #### 导入说明 在代码中导入该模块使用如下语句: ```typescript import promptAction from '@ohos.promptAction' ``` #### 使用示例 - **简单消息提示**:在引用[1]中,使用 `promptAction.showToast` 方法弹出简单的消息提示框,当用户名或密码为空时,提示“用户名或密码不能为空”,并设置提示框的持续时间和位置: ```typescript //ohos OpenHarmonyOS //弹窗 import promptAction from '@ohos.promptAction'; //判断 if(this.user=='' || this.password==''){ //不能跳转,同时给出弹窗提示 promptAction.showToast({ message: '用户名或密码不能为空', duration: 3000, //持续的时间 bottom: 60 }) ``` - **确认对话框**:在引用[2]中,使用 `promptAction.showDialog` 方法弹出确认对话框,询问用户是否确定返回到 `login` 页面,并根据用户的选择进行相应操作: ```typescript promptAction.showDialog({ message:'确定返回到login页面吗?', buttons: [ { text: '取消', color: '#FF0000' }, { text: '确认', color: '#0099FF' } ] }).then((result)=>{ if(result.index === 0){ // 用户点击了“取消”按钮 console.log('点击了取消按钮') } else if(result.index === 1){ // 用户点击了“确认”按钮 console.log('用户点击了“确认”按钮') // 调用router.back()方法,返回上一个页面 router.back(); } }).catch(err => { console.error(`Invoke showDialog failed, code is ${err.code}, message is ${err.message}`); }) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值