OpenHarmony 页面路由与跨页面数据传递全解实战
承接前三篇 ArkUI 组件开发,本篇聚焦Router 页面路由导航,覆盖页面跳转、返回传参、弹窗路由、命名路由、页面间数据交互,搭配完整 ArkTS 案例,是多页面应用开发必备内容。
一、前言
实际项目由多个页面组成(首页、详情、个人中心、登录页),依靠路由实现页面切换。OpenHarmony ArkUI 提供两种路由方案:Router(系统路由,页面跳转首选)、页面内自定义弹窗路由,同时配套正向传参、反向回传数据能力。本文从基础跳转→参数传递→综合项目案例循序渐进。
前置配置:路由需要在
src/main/resources/base/profile/main_pages.json注册页面路径。
二、main_pages.json 页面注册说明
新建页面后必须配置页面路由路径,示例配置:
json
{ "src": [ "pages/index/index", "pages/detail/detail", "pages/login/login" ] }- index:首页(入口页面)
- detail:详情页
- login:登录页
三、Router 基础 API 与基础跳转
引入路由模块:import router from '@ohos.router'常用方法:
router.pushUrl():入栈跳转,可返回上一页(最常用)router.replaceUrl():替换当前页面,无法返回上一页router.back():返回上一级页面
3.1 普通无参跳转(首页 index.ets)
ets
import router from '@ohos.router' @Entry @Component struct Index { build() { Column({space:20}){ Button("跳转详情页(push)") .width(200) .onClick(()=>{ router.pushUrl({url:"pages/detail/detail"}) }) Button("替换页面(replace)") .width(200) .onClick(()=>{ router.replaceUrl({url:"pages/detail/detail"}) }) } .width("100%") .height("100%") .justifyContent(FlexAlign.Center) } }3.2 详情页返回(detail.ets)
ets
import router from '@ohos.router' @Entry @Component struct Detail { build() { Column() { Text("详情页面").fontSize(22) Button("返回首页") .onClick(()=>{ router.back() }) } .width("100%") .height("100%") .justifyContent(FlexAlign.Center) } }四、正向页面传参(跳转携带数据)
跳转时通过params携带对象数据,目标页面router.getParams()接收。
4.1 首页携带参数跳转
ets
import router from '@ohos.router' @Entry @Component struct Index { build() { Column({space:20}){ Button("携带参数跳详情") .width(200) .onClick(()=>{ router.pushUrl({ url:"pages/detail/detail", params:{ id:1001, name:"OpenHarmony实战教程", price:39.9 } }) }) } .width("100%") .height("100%") .justifyContent(FlexAlign.Center) } }4.2 详情页接收参数
ets
import router from '@ohos.router' @Entry @Component struct Detail { @State id:number = 0 @State name:string = "" @State price:number = 0 aboutToAppear(){ // 生命周期获取路由参数 let data = router.getParams() this.id = data.id this.name = data.name this.price = data.price } build() { Column({space:15}) { Text(`编号:${this.id}`).fontSize(18) Text(`标题:${this.name}`).fontSize(18) Text(`价格:${this.price}`).fontSize(18) Button("返回首页").onClick(()=>router.back()) } .width("100%") .height("100%") .justifyContent(FlexAlign.Center) } }五、返回页面反向回传数据(回调传参)
从子页面返回首页并带回数据,借助pushUrl的success回调接收回传参数。
5.1 首页代码
ets
import router from '@ohos.router' @Entry @Component struct Index { @State backMsg:string = "" goDetail(){ router.pushUrl({url:"pages/detail/detail"},{ success:(res)=>{ // 监听页面关闭带回的数据 res.result.params && (this.backMsg = res.result.params.msg) } }) } build() { Column({space:20}){ Button("跳转详情(可回传数据)") .width(220) .onClick(()=>this.goDetail()) Text("子页面带回信息:"+this.backMsg).fontSize(18) } .width("100%") .height("100%") .justifyContent(FlexAlign.Center) } }5.2 详情页返回时携带参数
ets
import router from '@ohos.router' @Entry @Component struct Detail { build() { Column() { Button("确认带回数据并返回") .onClick(()=>{ // back携带params参数 router.back({ url:"pages/index/index", params:{msg:"从详情页返回:操作已完成!"} }) }) } .width("100%") .height("100%") .justifyContent(FlexAlign.Center) } }六、页面路由综合实战:登录跳转逻辑
业务场景:未登录点击个人中心→跳转登录页,登录成功携带登录状态返回首页。
- pages/index/index(首页)
ets
import router from '@ohos.router' @Entry @Component struct Index { @State isLogin:boolean = false @State userName:string = "" goLogin(){ router.pushUrl({url:"pages/login/login"},{ success:(res)=>{ if(res.result.params){ this.isLogin = res.result.params.loginFlag this.userName = res.result.params.name } } }) } build() { Column({space:25}){ if(this.isLogin){ Text(`欢迎用户:${this.userName},已登录`).fontSize(20).fontColor("#007DFF") }else{ Text("当前未登录,请前往登录").fontSize(18).fontColor("#f56c6c") } Button("前往登录页面") .width(200) .onClick(()=>this.goLogin()) } .width("100%") .height("100%") .justifyContent(FlexAlign.Center) } }- pages/login/login(登录页)
ets
import router from '@ohos.router' @Entry @Component struct Login { @State name:string = "" @State pwd:string = "" loginClick(){ // 模拟登录校验 if(this.name && this.pwd){ router.back({ params:{ loginFlag:true, name:this.name } }) } } build() { Column({space:18}){ TextInput({placeholder:"请输入用户名"}) .width("90%") .height(45) .onChange(val=>this.name=val) TextInput({placeholder:"请输入密码"}) .type(InputType.Password) .width("90%") .height(45) .onChange(val=>this.pwd=val) Button("登录") .width("90%") .height(48) .backgroundColor("#007DFF") .onClick(()=>this.loginClick()) Button("取消返回") .width("90%") .backgroundColor("#999") .onClick(()=>router.back()) } .width("100%") .height("100%") .padding(20) } }七、开发规范与路由优化总结
1. API 选用规范
- 需要保留返回栈(详情、登录):
pushUrl - 不需要返回(启动页→首页):
replaceUrl
2. 传参注意事项
- 简单字符串、数字、对象用路由 params 传递;大批量全局数据建议使用 AppStorage 全局存储;
- 在
aboutToAppear生命周期中获取路由参数,不要在 build 直接取值,避免渲染异常。
3. 项目优化技巧
- 统一封装路由工具类,把页面路径统一管理,避免硬编码 URL;
- 路由跳转前做判空,防止路径书写错误导致跳转失败;
- 大型项目拆分模块页面,按业务分包(user、goods、mine)。
