鸿蒙开发 - 页面路由(页面跳转、返回)

Harmony OS NEXT版本(接口及解决方案兼容API12版本或以上版本)

这篇文章主要介绍一个路由模块 @ohos.router,该模块提供了很多方式进行跳转页面,包括跳转到指定页面、替换当前页面、返回上一页,返回指定页(但官方并不推荐这种方式)

跳转指定页面

pushUrl

这种跳转方式:会保留当前页面,压入页面栈(目标页面会有返回按钮,可以返回上一个页面)

例如从首页 IndexPage 跳转到详情页 DetailPage,如下:

import router from '@ohos.router'

router.pushUrl({
  url: 'pages/DetailPage'
})
replaceUrl

这种跳转方式:替换了当前页面,当前页面不会保留,销毁了当前页面

例如从登录页 LoginPage 跳转到首页 IndexPage,如下:

import router from '@ohos.router'

router.replaceUrl({
  url: 'pages/IndexPage'
})

带参数的路由跳转

列表页面 ListPage.ets

从列表页 ListPage 跳转到详情页 DetailPage,调用方法时添加一个 params 属性,并传递列表项的 idname 作为参数

import router from '@ohos.router'

interface TypeInterface {
  id: number;
  name: string;
}

@Entry
@Component
struct ListPage {
  @State listData: Array<TypeInterface> = [
    { id: 1, name: 'item1' },
    { id: 2, name: 'item2' }
  ]
  
  build() {
    Row() {
      Column() {
        ForEach(this.listData, (item: TypeInterface) => {
          Text(`列表条目:${item.name}`)
            .onClick(() => {
              router.pushUrl({
                url: 'pages/router/DetailPage',
                params: item
              })
            })
        })
      }
    }
  }
}

详情页 DetailPage.ets

详情页使用 router.getParams() 获取列表页传过来的参数

import router from '@ohos.router'

interface TypeInterface {
  id: number;
  name: string;
}

@Entry
@Component
struct DetailPage {
  @State itemId: number = 0
  @State itemName: string = ''

  onPageShow() {
    let params = router.getParams() as TypeInterface
    if (params) {
      this.itemId = params.id
      this.itemName = params.name
    }
  }

  build() {
    Row() {
      Column() {
        Text(`详情页 - id:${this.itemId},name:${this.itemName}`)
      }
    }
  }
}

img.png

跳转命名路由页面

比如A页面跳转到B页面,如下:

B页面:

B页面需要使用 routeName 给这个页面命一个名字

@Entry({ routeName: 'B' })

A页面:

A页面指定B页面的名字

router.pushNameRouter({name: 'B'})

页面返回

  1. 返回上一页
router.back()
  1. 返回指定页面
router.back({
  url: 'pages/home'
})
  1. 返回到指定页面,并传递参数
router.back({
  url: 'pages/home',
  params: {
    id: 1
  }
})

指定页面使用 router.getParams() 获取参数

某些场景

  • 开启页面返回询问对话框

当在某些特殊场景的时候,监听到用户返回上一个页面,会做些提示处理。比如用户到了支付界面,没有支付完成,返回上个页面会进行提示,如下:

onBackPress(){
  try {
    router.showAlertBeforeBackPage({
      message: '您还没有完成支付,确定要返回吗?'
    })
  } catch(err){
    console.error(`Invoke showAlertBeforeBackPage failed, code is ${err.code}, message is ${err.message}`)
  }
}

最后

文档地址

### 创建 HarmonyOS 路由容器组件以实现页面跳转HarmonyOS 开发中,通过 `Navigator` 组件可以轻松实现页面之间的路由跳转。以下是具体的操作流程以及示例代码: #### 1. 配置路由信息 在应用的配置文件中定义页面路由路径和名称。这一步骤通常是在项目的入口文件或者全局配置中完成。 ```typescript // app.config.ts 或其他全局配置文件 export const routes = [ { path: '/home', name: 'Home' }, { path: '/details', name: 'Details' } ]; ``` 此部分用于指定各个页面对应的路径及其唯一标识名[^1]。 --- #### 2. 使用 Navigator 容器组件 `Navigator` 是 HarmonyOS 提供的一个专门用于管理页面跳转的容器组件。它支持多种方式触发页面跳转操作。 ##### 基本语法结构 ```typescript import { Router, Routes } from '@ohos/router'; @Component struct App { build() { Column() { Navigator(routes: this.routes) {} // 将路由列表传递给 Navigator }.width('100%').height('100%') } private routes = [ { uri: '/home', component: Home }, // 指定目标 URI 和对应组件 { uri: '/details', component: Details } ]; } ``` 上述代码展示了如何初始化并注册多个页面到 `Navigator` 中[^5]。 --- #### 3. 执行页面跳转 利用 `Router` 的实例化对象调用 `push()` 方法来发起新的页面跳转请求。 ```typescript @Entry @Component struct HomePage { @State index: number = 0; build() { Row() { Button("Go to Details") { onClick: () => { router.push('/details'); // 推送新页面至栈顶 } } } } } @Component struct DetailPage { build() { Text("This is the detail page!") .fontSize(20) .fontColor('#FFFFFF'); } } ``` 这里演示了从主页 (`HomePage`) 到详情页 (`DetailPage`) 的简单跳转逻辑。 --- #### 4. 添加命名路由 (可选) 如果希望更灵活地控制跳转行为,则可以通过为每条记录分配唯一的字符串键对形式参数——即所谓的 **命名路由** 来简化 URL 构造过程。 ```typescript @Entry({ routeName: 'detailView' }) @Component struct DetailPage {} function navigateToDetailView() { router.push({ routeName: 'detailView', params: { id: 123 } // 可附加额外数据传输 }); } ``` 这种做法不仅提高了代码可读性和维护效率,还允许开发者直接引用预设好的名字而非硬编码实际地址[^3]。 --- #### 5. 处理返回事件 除了前进外,还需要考虑用户可能随时按下物理按键退出当前视图的情况。此时可通过监听特定信号源捕获此类动作的发生时刻以便采取适当措施加以应对。 ```typescript @Entry @Component struct SomeComponent { onPageBackPress(): boolean { console.info("User pressed back button"); return false; // 返回 true 表示拦截默认处理机制 } build() {} } ``` 注意此处仅适用于标记有 `@Entry` 注解的顶级单元才具备完整的生命周期回调接口访问权限[^2]。 --- ### 总结 综上所述,在 HarmonyOS 平台构建跨屏交互体验时,合理运用内置工具链能够极大程度降低复杂度的同时提升整体性能表现水平。借助于清晰明了的设计模式配合简洁直观的语言特性共同作用下达成预期效果变得轻而易举起来!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值