HarmonyOS--路由管理--页面路由 (@ohos.router)

文档中心

页面路由 (@ohos.router)

1、页面路由指在应用程序中实现不同页面之间的跳转和数据传递

2、Router模块通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面

3、本文将从页面跳转页面返回页面返回前增加一个询问框命名路由几个方面介绍Router模块提供的功能。

4、Router适用于模块间与模块内页面切换,通过每个页面的url实现模块间解耦

5、模块内页面跳转时,为了实现更好的转场动效场景不建议使用该模块,推荐使用Navigation

页面跳转

跳转模式

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

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

实例模式

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

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

页面返回

1、返回到上一个页面。

import router from '@ohos.router';
router.back();

2、返回到指定页面

import router from '@ohos.router';
router.back({
  url: 'pages/Home'
});


// 返回命名路由页面
router.back({
  url: 'myPage' //myPage为返回的命名路由页面别名
});

3、返回到指定页面,并传递自定义参数信息。

import router from '@ohos.router';
router.back({
  url: 'pages/Home',
  params: {
    info: '来自Home页'
  }
});




// 返回命名路由页面
router.back({
  url: 'myPage', //myPage为返回的命名路由页面别名
  params: {
    info: '来自Home页'
  }
});

获取路由参数

在目标页面中,在需要获取参数的位置调用router.getParams()方法即可,例如在onPageShow()生命周期回调中

import router from '@ohos.router';

@Entry
@Component
struct Home {
  @State message: string = 'Hello World';

  onPageShow() {
    const params = router.getParams() as Record<string, string>; // 获取传递过来的参数对象
    if (params) {
      const info: string = params.info as string; // 获取info属性的值
    }
  }
  ...
}

页面返回前增加一个询问框

系统默认询问框

1、router.showAlertBeforeBackPage()方法接收一个对象作为参数,该对象包含以下属性:

message:string类型,表示询问框的内容。

2、如果调用成功,则会在目标界面开启页面返回询问框;如果调用失败,则会抛出异常,并通过err.code和err.message获取错误码和错误信息

3、当用户点击“返回”按钮时,会弹出确认对话框,询问用户是否确认返回。选择“取消”将停留在当前页目标页面;选择“确认”将触发router.back()方法,并根据参数决定如何执行跳转。

import router from '@ohos.router';
import { BusinessError } from '@ohos.base';

// 定义一个返回按钮的点击事件处理函数
function onBackClick(): void {
  // 调用router.showAlertBeforeBackPage()方法,设置返回询问框的信息
  try {
    router.showAlertBeforeBackPage({
      message: '您还没有完成支付,确定要返回吗?' // 设置询问框的内容
    });
  } catch (err) {
    let message = (err as BusinessError).message
    let code = (err as BusinessError).code
    console.error(`Invoke showAlertBeforeBackPage failed, code is ${code}, message is ${message}`);
  }

  // 调用router.back()方法,返回上一个页面
  router.back();
}

自定义询问框

自定义询问框的方式,可以使用弹窗或者自定义弹窗实现。这样可以让应用界面与系统默认询问框有所区别,提高应用的用户体验度。

import router from '@ohos.router';
import promptAction from '@ohos.promptAction';
import { BusinessError } from '@ohos.base';

function onBackClick() {
  // 弹出自定义的询问框
  promptAction.showDialog({
    message: '您还没有完成支付,确定要返回吗?',
    buttons: [
      {
        text: '取消',
        color: '#FF0000'
      },
      {
        text: '确认',
        color: '#0099FF'
      }
    ]
  }).then((result:promptAction.ShowDialogSuccessResponse) => {
    if (result.index === 0) {
      // 用户点击了“取消”按钮
      console.info('User canceled the operation.');
    } else if (result.index === 1) {
      // 用户点击了“确认”按钮
      console.info('User confirmed the operation.');
      // 调用router.back()方法,返回上一个页面
      router.back();
    }
  }).catch((err:Error) => {
    let message = (err as BusinessError).message
    let code = (err as BusinessError).code
    console.error(`Invoke showDialog failed, code is ${code}, message is ${message}`);
  })
}

命名路由

1、在开发中为了跳转到共享包Har或者Hsp中的页面(即共享包中路由跳转),可以使用router.pushNamedRoute()来实现。

命名路由的方式

// library/src/main/ets/pages/Index.ets
// library为新建共享包自定义的名字
@Entry({ routeName: 'myPage' })
@Component
export struct MyComponent {
  build() {
    ...
  }
}

命名路由跳转配置

配置成功后需要在跳转的页面中引入命名路由的页面

import router from '@ohos.router';
import { BusinessError } from '@ohos.base';
import('@ohos/library/src/main/ets/pages/Index');  // 引入共享包中的命名路由页面
@Entry
@Component
struct Index {
  build() {
      Text('Hello World')
        .onClick(() => { // 点击跳转到其他共享包中的页面
          try {
            router.pushNamedRoute({
              name: 'myPage',
              params: {
                data1: 'message',
                data2: {
                  data3: [123, 456, 789]
                }
              }
            })
          } catch (err) {
            ...
          }
        })
  }
}

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,可以非常方便的实现单页面应用程序的路由功能。 Vue Router 提供了以下两种方式实现页面路由跳转: 1. 声明式导航:通过 `<router-link>` 组件实现页面跳转,该组件会被渲染成一个 `<a>` 标签,点击该标签后会触发路由跳转。 2. 编程式导航:通过 `$router` 对象提供的方法实现页面跳转,例如 `$router.push()`、`$router.replace()`、`$router.go()` 等方法。 下面我们来看一个简单的示例,在 Vue Router 中如何实现页面路由跳转: ```html <!-- 在模板中使用 router-link 组件 --> <router-link to="/home">Home</router-link> <!-- 在组件中使用 $router 对象实现编程式导航 --> <button @click="$router.push('/about')">About</button> ``` 在上面的示例中,我们分别演示了如何使用 `<router-link>` 组件和 `$router` 对象实现页面路由跳转,其中 `to` 属性表示跳转的目标路由地址。 此外,Vue Router 还支持路由嵌套的功能,可以通过嵌套路由的方式实现页面的嵌套展示。下面我们来看一个嵌套路由的示例: ```javascript const router = new VueRouter({ routes: [ { path: '/home', component: Home, children: [ { path: 'news', component: News }, { path: 'videos', component: Videos } ] } ] }) ``` 在上面的示例中,我们定义了一个名为 `Home` 的路由组件,并在该组件中嵌套了两个子路由 `News` 和 `Videos`,这样就可以实现在 `Home` 组件中展示新闻和视频内容的功能。在实际开发中,我们可以根据实际需求来定义不同的路由组件和子路由,实现灵活的页面嵌套效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值