news 2026/7/27 2:04:40

HarmonyOs应用《日记本》开发第19篇 - 页面路由与导航机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOs应用《日记本》开发第19篇 - 页面路由与导航机制

本篇深入探讨鸿蒙 ArkUI 中的页面路由系统,分析日记应用中三个页面之间的导航关系和参数传递机制。

一、路由概述

在鸿蒙 ArkUI 中,页面路由通过@ohos.router模块实现。日记应用包含三个页面,它们之间形成了清晰的导航关系:

┌──────────────┐ │ Index │ │ (日记列表) │ └──────┬───────┘ │ pushUrl ┌────┴────┐ pushUrl ▼ ▼ ┌────────────┐ ┌──────────────┐ │ DiaryEdit │ │ DiaryDetail │ │ (编辑/新建) │ │ (详情查看) │ └──────┬─────┘ └──────┬───────┘ │ │ │ pushUrl │ └───────────────┘

二、路由配置

2.1 页面注册

main_pages.json中注册所有页面:

{"src":["pages/Index","pages/DiaryEdit","pages/DiaryDetail"]}

配置说明:

  • src数组列出所有页面路径
  • 第一个页面pages/Index是应用的入口页面
  • 路径相对于src/main/ets/目录

2.2 页面文件位置

entry/src/main/ets/ ├── pages/ │ ├── Index.ets # 日记列表页 │ ├── DiaryEdit.ets # 日记编辑页 │ └── DiaryDetail.ets # 日记详情页

三、路由跳转方式

3.1 pushUrl — 压栈跳转

importrouterfrom'@ohos.router'// 跳转到编辑页(新建模式)router.pushUrl({url:'pages/DiaryEdit',params:{mode:'create'}})// 跳转到详情页router.pushUrl({url:'pages/DiaryDetail',params:{id:diary.id}})

pushUrl 特点:

  • 将目标页面压入路由栈,当前页面保留在栈底
  • 目标页面可以通过router.back()返回当前页面
  • 适合层级导航(列表 → 详情 → 编辑)

3.2 replaceUrl — 替换跳转

router.replaceUrl({url:'pages/Index',params:{}})

replaceUrl 特点:

  • 用目标页面替换当前页面,当前页面出栈
  • 无法通过router.back()返回当前页面
  • 适合登录后跳转主页等场景

3.3 back — 返回上一页

// 返回上一页router.back()// 返回指定页面router.back({url:'pages/Index'})

3.4 clear — 清空路由栈

router.clear()

清空所有页面,通常在退出应用或切换用户时使用。

四、参数传递

4.1 发送参数

// 发送简单参数router.pushUrl({url:'pages/DiaryDetail',params:{id:'abc123'}})// 发送复杂对象router.pushUrl({url:'pages/DiaryEdit',params:{mode:'edit',id:'abc123',title:'日记标题',content:'日记内容'}})

4.2 接收参数

aboutToAppear(){constparams=router.getParams()asRecord<string,string>if(params){constmode=params.mode// 'edit' 或 'create'constid=params.id// 日记IDconsttitle=params.title// 日记标题}}

参数接收注意事项:

  • router.getParams()返回Object类型,需要类型断言
  • aboutToAppear生命周期中获取参数
  • 需要进行空值检查,防止参数缺失导致崩溃

4.3 参数传递的完整示例

Index 页面跳转到 Detail:

// Index.etsprivategoToDetail(diaryId:string){router.pushUrl({url:'pages/DiaryDetail',params:{id:diaryId}})}

Detail 页面接收参数:

// DiaryDetail.etsaboutToAppear(){constparams=router.getParams()asRecord<string,string>if(params&&params.id){this.diaryId=params.idthis.loadDiaryDetail(params.id)}}

Detail 页面跳转到 Edit:

// DiaryDetail.etsprivategoToEdit(){router.pushUrl({url:'pages/DiaryEdit',params:{mode:'edit',id:this.diaryId}})}

Edit 页面接收参数:

// DiaryEdit.etsaboutToAppear(){constparams=router.getParams()asRecord<string,string>if(params&&params.mode==='edit'){this.isEditMode=truethis.editId=params.idthis.loadDiary(params.id)}}

五、路由动画

5.1 默认动画

鸿蒙默认提供页面切换动画:

  • push:从右向左滑入
  • back:从左向右滑出

5.2 自定义动画

router.pushUrl({url:'pages/DiaryDetail',params:{id:diaryId},animations:{duration:300,curve:Curve.EaseInOut,direction:AnimationDirection.RightToLeft}})

六、路由模式

6.1 Standard(默认)

router.pushUrl({url:'pages/DiaryDetail',params:{id:diaryId}},router.RouterMode.Standard)

每次跳转都创建新页面实例,路由栈可能出现多个相同页面。

6.2 Single

router.pushUrl({url:'pages/DiaryDetail',params:{id:diaryId}},router.RouterMode.Single)

如果路由栈中已有该页面,将其上方的页面全部出栈,复用该页面。

七、路由栈管理

7.1 路由栈结构

初始状态: ┌──────────┐ │ Index │ ← 栈底 └──────────┘ 跳转到 Detail: ┌──────────┐ │ Detail │ ← 栈顶 ├──────────┤ │ Index │ ← 栈底 └──────────┘ 跳转到 Edit: ┌──────────┐ │ Edit │ ← 栈顶 ├──────────┤ │ Detail │ ├──────────┤ │ Index │ ← 栈底 └──────────┘ back 返回 Detail: ┌──────────┐ │ Detail │ ← 栈顶 ├──────────┤ │ Index │ ← 栈底 └──────────┘

7.2 获取路由栈信息

conststackSize=router.getLength()conststack=router.getState()console.log(`当前路由栈大小:${stackSize}`)console.log(`当前页面:${stack.name}`)

八、路由返回携带参数

8.1 通过全局状态

// 编辑页面保存成功后设置全局状态AppStorage.Set('diaryUpdated',true)router.back()// 列表页面检查onPageShow(){constupdated=AppStorage.Get<boolean>('diaryUpdated')if(updated){this.loadDiaries()AppStorage.Set('diaryUpdated',false)}}

8.2 通过 router.back params

// 编辑页面router.back({url:'pages/Index'})// 列表页面在 onPageShow 中刷新onPageShow(){this.loadDiaries()}

九、路由守卫与拦截

虽然鸿蒙没有直接的路由守卫 API,但可以通过封装路由方法实现拦截:

exportclassRouterUtil{staticpushUrl(url:string,params?:Record<string,string>){// 前置检查if(!this.checkPermission(url)){promptAction.showToast({message:'无访问权限'})return}router.pushUrl({url,params})}staticcheckPermission(url:string):boolean{// 权限检查逻辑returntrue}}

十、总结

鸿蒙路由系统的核心要点:

  1. 页面注册:在main_pages.json中声明所有页面
  2. 跳转方式pushUrl(压栈)、replaceUrl(替换)、back(返回)
  3. 参数传递:通过params传递,通过router.getParams()接收
  4. 路由模式Standard(多实例)和Single(单例)
  5. 栈管理:理解路由栈结构,合理使用backclear
  6. 页面刷新:通过onPageShow生命周期实现返回后刷新

日记应用的路由设计简洁清晰,列表 → 详情 → 编辑的三层导航是移动应用的经典模式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 2:03:55

无人机智能停车位检测系统:多传感器融合与路径规划

1. 无人机智能停车位检测系统概述无人机技术的快速普及带来了一个意想不到的挑战&#xff1a;如何高效管理这些飞行器的停放。想象一下繁忙的物流中心&#xff0c;数十架无人机需要频繁起降&#xff0c;传统的人工管理方式显然已经力不从心。这正是我们开发无人机智能停车位检测…

作者头像 李华
网站建设 2026/7/27 2:02:03

C语言实现栅栏密码:古典置换算法的原理与健壮代码实践

1. 项目概述&#xff1a;从“栅栏”到“密文”在信息安全领域&#xff0c;加密算法是构建信任的基石。对于初学者或需要快速实现简单数据混淆的场景&#xff0c;那些结构复杂、数学理论深厚的现代密码学算法&#xff08;如AES、RSA&#xff09;往往让人望而却步。这时&#xff…

作者头像 李华
网站建设 2026/7/27 2:01:28

AI Agent开发:从微调到上下文工程的演进与实践

1. 从微调转向上下文工程&#xff1a;AI Agent开发的新范式在构建AI Agent的实践中&#xff0c;我们正经历着一场静默的革命。三年前&#xff0c;当我第一次尝试开发任务型AI助手时&#xff0c;业界标准做法还是收集大量领域数据&#xff0c;对预训练模型进行微调&#xff08;F…

作者头像 李华
网站建设 2026/7/27 2:01:02

TMS320VC5402A DSP接口时序深度解析:从建立保持时间到HPI、McBSP实战

1. 项目概述&#xff1a;从时序图到稳定通信的桥梁在嵌入式DSP系统设计的江湖里&#xff0c;时序分析是每个硬件工程师必须修炼的内功心法。你或许能熟练地绘制原理图、焊接BGA封装&#xff0c;也能写出高效的C代码&#xff0c;但如果对处理器与外部世界“对话”的精确时间窗口…

作者头像 李华
网站建设 2026/7/27 2:01:01

Agent 心跳与健康检查:长连接场景下的会话状态监控

Agent 心跳与健康检查&#xff1a;长连接场景下的会话状态监控Agent 连着连着就没了反应——你不知道它是真的在思考&#xff0c;还是已经悄悄挂了。一、场景痛点 你的 Agent 系统用 WebSocket 维持长连接&#xff0c;用户发一条消息后 Agent 需要调用多个工具&#xff0c;耗时…

作者头像 李华
网站建设 2026/7/27 1:59:24

C5504 DSP核心外设实战:SPI、USB、GPIO与JTAG配置与调试指南

1. 项目概述&#xff1a;深入理解C5504 DSP的四大关键外设在嵌入式DSP系统开发中&#xff0c;芯片本身的计算能力固然重要&#xff0c;但如何高效、稳定地与外部世界“对话”才是项目成败的关键。TMS320C5504作为一款经典的定点数字信号处理器&#xff0c;其丰富的片上外设资源…

作者头像 李华