HarmonyOS开发实战:笔友-页面间回调——onPageShow/onPageHide 时序与数据回传
前言在路由跳转场景中页面间回调是“从下级页面返回后刷新数据“的关键机制。xiexin 的Index.ets通过onPageShow生命周期实现了从详情页返回后自动刷新列表。本文将以Index.ets、PenPalDetailPage.ets、ComposePage.ets为蓝本详细剖析onPageShow/onPageHide的触发时序包括onPageShow数据刷新、onPageHide草稿保存、AppStorage跨页面状态同步以及router.back()数据回传。一、onPageShow 数据刷新Entry Component struct Index { StorageProp(letters) letters: Letter[] []; StorageProp(penPals) penPals: PenPal[] []; onPageShow(): void { // 从详情页返回时AppStorage 已自动同步数据 console.log(Index onPageShow, letters length:, this.letters.length); } }二、onPageHide 草稿保存Entry Component struct ComposePage { State body: string ; onPageHide(): void { if (this.body.length 0) { AppStorage.setOrCreate(draft_body, this.body); } } }三、onPageShow/onPageHide 时序sequenceDiagram participant Index as Index participant Detail as DetailPage Index-Detail: router.pushUrl Index-Index: onPageHide Detail-Detail: onPageShow Detail-Detail: 用户交互 Detail-Detail: router.back() Detail-Detail: onPageHide Index-Index: onPageShow四、AppStorage 数据同步// ComposePage 添加信件 DataStore.addLetter(letter); // Index 自动刷新通过 StorageProp StorageProp(letters) letters: Letter[] [];HarmonyOS 功能实现示意图总结本文详细剖析了 xiexin 的页面间回调机制重点讲解了onPageShow数据刷新、onPageHide草稿保存、AppStorage跨页面状态同步以及router.back()数据回传。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力HarmonyOS 应用开发指南https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-dev-guideHarmonyOS 状态管理概述https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state-management-overviewHarmonyOS 高性能编程实践https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-high-performance-programmingHarmonyOS 自定义组件https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-custom-components相关资源开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netHarmonyOS 自定义组件生命周期https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-custom-components-lifecycle十一、深度实现分析11.1 核心原理本功能的核心原理基于 ArkUI 的响应式状态管理机制。当 State 或 Prop 装饰的变量发生变化时ArkUI 引擎会自动触发依赖该变量的 UI 部分重新渲染无需手动操作 DOM。11.2 数据流设计graph LR A[用户交互] -- B[State 变量变化] B -- C[ArkUI 引擎检测] C -- D[UI 重渲染] D -- E[用户看到新界面]11.3 性能考虑避免不必要渲染使用 Watch 控制渲染时机减少嵌套深度保持组件树扁平化合理使用缓存计算结果可缓存避免重复计算十二、实际项目应用在 xiexin 项目中本功能被应用于以下场景笔友列表展示笔友通信状态和关系阶段信件卡片展示信件内容和状态标签统计页面展示写信趋势数据和统计指标Component export struct ExampleComponent { Prop data: string[] []; build() { Column() { ForEach(this.data, (item: string) { Text(item).fontSize(14).padding(8) }, (item: string) item) } } }十三、生产环境注意事项错误处理所有异步操作需要 try-catch 包围日志记录使用 hilog 记录关键操作和异常信息性能监控使用 hiTraceMeter 进行性能埋点分析内存管理及时清理定时器和监听器避免内存泄漏try { await this.loadData(); hilog.info(0xFF00, TAG, Data loaded successfully); } catch (err) { hilog.error(0xFF00, TAG, Failed to load: %{public}s, err.message); }十四、代码审查清单Prop 变量是否已赋默认值定时器是否在 aboutToDisappear 中清理列表渲染的 keyGenerator 是否唯一且稳定条件渲染是否使用 if/else 而非 Visibility.Hidden复杂计算结果是否已缓存事件监听器是否在 aboutToDisappear 中取消注册十五、综合示例Entry Component struct DemoPage { State items: string[] [示例1, 示例2, 示例3]; State count: number 0; build() { Column({ space: 16 }) { Text(综合示例).fontSize(24).fontWeight(FontWeight.Bold) Text(计数: ${this.count}).fontSize(16) Row({ space: 8 }) { Button(增加).onClick(() { this.count }) Button(减少).onClick(() { if (this.count 0) this.count-- }) Button(重置).onClick(() { this.count 0 }) } List() { ForEach(this.items, (item: string) { ListItem() { Text(item).fontSize(14).padding(12) } }, (item: string) item) }.height(200) }.padding(16).width(100%) } }十六、相关 API 参考API说明版本要求State组件内部状态管理API 9Prop父子单向传递API 9Link父子双向同步API 9Watch状态变化监听API 9AppStorage全局状态存储API 9PersistentStorage持久化存储API 9十七、代码规范与最佳实践17.1 命名规范组件命名使用 PascalCase如AvatarComponent、PenPalCard变量命名使用 camelCase如avatarSize、selectedIndex常量命名使用 UPPER_CASE如MAX_COUNT、DEFAULT_SIZE私有方法以下划线开头如_getAvatarColor文件命名使用 kebab-case如common-components.ets17.2 代码组织每个组件文件只包含一个 Entry 组件通用组件放在 components/ 目录下页面组件放在 pages/ 目录下常量配置放在 common/ 目录下数据模型放在 model/ 目录下十八、常见面试题Q1: State 和 Prop 的区别是什么A: State 是组件内部私有状态只能在当前组件内修改Prop 是父组件传递进来的数据在子组件中只能读取修改不会影响父组件。Q2: ForEach 的 keyGenerator 为什么重要A: keyGenerator 决定了 ForEach 进行 Diff 算法的依据。如果键值不稳定或重复会导致列表项渲染异常如闪烁、状态丢失等问题。十九、调试技巧使用 DevEco Profiler监控帧率和布局耗时定位卡顿根因使用 hilog打印关键日志追踪代码执行路径使用 hiTraceMeter进行性能埋点分析识别性能瓶颈使用 Watch监听状态变化调试状态更新逻辑State Watch(onDebugChange) debugValue: string ; onDebugChange(): void { console.log(Value changed to:, this.debugValue); }二十、总结与最佳实践20.1 核心要点总结状态管理合理选择 State/Prop/Link/StorageProp 装饰器组件设计遵循单一职责原则保持组件聚焦性能优化大数据量使用 LazyForEach组件复用使用 Reusable代码质量编写单元测试使用 Hypium 框架样式管理使用 AppColors 设计令牌统一管理颜色20.2 避免的反模式避免在 build 函数中执行耗时操作这会阻塞 UI 渲染避免在 State 中存储大型对象会导致不必要的重渲染避免过度使用 Link 增加组件耦合优先使用 Prop避免在 aboutToAppear 中执行异步操作使用生命周期合理分配避免使用全局变量替代 StorageProp全局变量无法触发响应式更新提示以上最佳实践基于 xiexin 项目的实际开发经验总结建议在项目开发中遵守这些原则可以有效提升代码质量和开发效率。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netHarmonyOS 应用开发指南https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-dev-guideHarmonyOS 状态管理概述https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state-management-overviewHarmonyOS 高性能编程实践https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-high-performance-programmingHarmonyOS 自定义组件https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-custom-componentsHarmonyOS 组件封装https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-component-encapsulationHarmonyOS Builder 装饰器https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builderHarmonyOS 组件复用https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-reusable二十一、深度扩展阅读21.1 组件设计原则在 ArkUI 中设计组件时需要遵循以下原则单一职责每个组件只负责一个功能避免职责过多开闭原则对扩展开放对修改关闭通过参数化配置实现依赖倒置依赖抽象而非具体实现降低耦合度接口隔离使用小接口而非大接口避免冗余依赖21.2 性能优化策略使用 LazyForEach大数据量列表使用懒加载只渲染可见项组件复用使用 Reusable 装饰器复用组件减少创建销毁开销状态管理合理使用 State/Prop/Link避免不必要重渲染动画优化使用 animateTo 替代 setInterval减少 CPU 占用21.3 代码示例Component export struct OptimizedComponent { Prop items: string[] []; State selectedIndex: number -1; build() { List() { LazyForEach(this.items, (item: string, index: number) { ListItem() { Text(item).fontSize(16).padding(16) .backgroundColor(this.selectedIndex index ? AppColors.AMBER_LIGHT : AppColors.WHITE) .onClick(() { this.selectedIndex index; }) } }, (item: string) item) } .cachedCount(3) .scrollBar(BarState.Off) } }21.4 常见问题与解决方案问题类型具体问题解决方案编译错误Prop 未赋默认值在声明时添加默认值运行时错误路由参数未定义添加空值检查性能问题列表渲染卡顿使用 LazyForEach内存泄漏定时器未清理在 aboutToDisappear 中清理状态丢失State 变量未初始化在声明时赋默认值渲染异常ForEach 键值重复使用唯一 ID 作为键值21.5 推荐实践使用 AppColors 设计令牌统一管理颜色避免硬编码色值使用 Constants.ets 集中管理常量避免魔法数字使用 DataStore 门面模式封装数据操作统一访问入口使用 Builder 提取复用 UI 片段减少重复代码使用 BuilderParam 实现组件插槽提升组件灵活性二十二、补充说明提示本文提供的代码示例基于 HarmonyOS API 12适用于 HarmonyOS 5.0 及以上版本。如果你使用的是较低版本部分 API 可能不兼容。本文所有代码均可在 xiexin 项目中找到实际应用场景建议结合 DevEco Studio 开发工具进行调试和验证如有疑问欢迎在评论区留言讨论我会及时回复更多 HarmonyOS 开发资源请参考官方文档和开发者社区22.1 扩展阅读推荐HarmonyOS 应用开发指南ArkUI 声明式开发范式状态管理详解高性能编程实践自定义组件二十三、补充内容23.1 代码规范与命名约定在团队协作中代码规范是保证代码质量的基础。以下是推荐的命名规范组件命名使用 PascalCase如AvatarComponent、PenPalCard变量命名使用 camelCase如avatarSize、selectedIndex常量命名使用 UPPER_CASE如MAX_COUNT、DEFAULT_SIZE文件命名使用 kebab-case如common-components.ets23.2 注释规范/** * 组件说明 * param name 参数说明 * param size 参数说明 */ Component export struct MyComponent { Prop name: string ; Prop size: number 48; }23.3 版本管理每次发布前更新 versionCode 和 versionName使用语义化版本号 X.Y.Z主版本.次版本.修订版本记录版本变更日志便于回溯问题二十四、参考文档HarmonyOS 应用开发指南ArkUI 声明式开发范式状态管理 V1状态管理 V2高性能编程实践自定义组件组件封装Builder 装饰器二十五、补充说明提示本文提供的代码示例基于 HarmonyOS API 12适用于 HarmonyOS 5.0 及以上版本。如果你使用的是较低版本部分 API 可能不兼容请根据实际开发环境进行调整。本文所有代码均可在 xiexin 项目中找到实际应用场景建议结合 DevEco Studio 开发工具进行调试和验证如有疑问欢迎在评论区留言讨论我会及时回复更多 HarmonyOS 开发资源请参考官方文档和开发者社区参考文档HarmonyOS 应用开发指南ArkUI 声明式开发范式状态管理详解高性能编程实践

相关新闻

HarmonyOS开发实战:笔友-AppStorage.SetOrCreate 的初始化时序与覆盖陷阱

HarmonyOS开发实战:笔友-AppStorage.SetOrCreate 的初始化时序与覆盖陷阱

前言 在 ArkUI 状态管理中,AppStorage.setOrCreate 和 AppStorage.set 是两个关键的写入 API。xiexin 的 DataStore.initializeData() 中使用了 setOrCreate 初始化所有全局状态,这种选择直接决定了“冷启动覆盖用户数据“的行为。 本文将以 DataStore…

2026/9/17 5:06:39 阅读更多 →
PostgreSQL:国产数据库的技术基石与自主创新路径解析

PostgreSQL:国产数据库的技术基石与自主创新路径解析

在数据库技术领域,尤其是企业级应用和国产化替代的浪潮下,PostgreSQL(简称PG)是一个无法绕开的名字。它不仅是全球最先进的开源对象关系型数据库之一,更是众多国产数据库的“技术基石”。许多开发者在使用国产数据库时,会发现其语法、特性甚至报错信息都似曾相识,这背后…

2026/9/22 4:37:18 阅读更多 →
Python Pygame贪吃蛇实战:从零掌握游戏循环与碰撞检测

Python Pygame贪吃蛇实战:从零掌握游戏循环与碰撞检测

1. 项目概述:为什么用Pygame做贪吃蛇是绝佳的入门选择 如果你刚学完Python基础语法,正愁找不到一个能串联起变量、循环、列表、函数等知识点的实战项目,那用Pygame做一个贪吃蛇游戏,绝对是你的不二之选。这听起来可能有点“复古”…

2026/9/14 17:16:16 阅读更多 →

最新新闻

菱形虚拟继承的原理

菱形虚拟继承的原理

目录 摘要: 一 :菱形继承的概念及问题 1:概念 2:问题 二:虚拟菱形继承 1:语法 2:原理 ①:菱形继承的内存分布 ②:虚拟菱形继承的内存分布 ③:偏移量…

2026/9/23 15:44:20 阅读更多 →
学术写作AI:破解黑话,提升论文可读性与影响力

学术写作AI:破解黑话,提升论文可读性与影响力

1. 项目概述:当学术写作遇上"人话革命"去年审阅某核心期刊投稿时,我遇到一篇让我哭笑不得的论文——作者用"基于多维度认知框架的跨模态表征重构"来描述"用不同方法分析数据",通篇充斥着"后现代性话语解构…

2026/9/23 15:44:20 阅读更多 →
LPDDR5内存训练全流程解析:从ZQ校准到周期重训练的工程实践

LPDDR5内存训练全流程解析:从ZQ校准到周期重训练的工程实践

简介:面向内存控制器设计与嵌入式系统开发工程师,系统讲解LPDDR5内存的初始化与完整训练流程。内容涵盖上电初始化时序、ZQ校准(含输出驱动器阻抗校准与CA/DQ ODT阻抗校准)、命令总线训练、WCK与CK对齐、WCK占空比训练、读门控训练…

2026/9/23 15:44:20 阅读更多 →
3个避坑技巧搞定人体器官分布图代码面试必问

3个避坑技巧搞定人体器官分布图代码面试必问

3个避坑技巧搞定人体器官分布图代码面试必问 复制来的代码跑不通,控制台一堆红字报错,这时候你是不是只想把电脑砸了?这种“看似能跑实则崩盘”的情况,在技术面试中简直是重灾区。很多候选人拿着网上抄的 SVG 或 Canvas…

2026/9/23 15:44:20 阅读更多 →
搞定空间寄语:前端高薪必备的5个高频面试题

搞定空间寄语:前端高薪必备的5个高频面试题

搞定空间寄语:前端高薪必备的5个高频面试题 别再用“Hello World”糊弄自己了。很多学员学完语法,对着空白文档发呆,根本不知道怎么把零散的代码拼成一个能跑的项目。更扎心的是,面试官问起 高频面试题…

2026/9/23 15:44:20 阅读更多 →
RBAC权限系统设计与认证授权实践指南

RBAC权限系统设计与认证授权实践指南

1. 认证授权基础概念解析认证(Authentication)和授权(Authorization)是每个后端开发者必须掌握的核心安全机制。认证解决"你是谁"的问题,就像进入公司大楼时需要刷工牌确认身份;授权则解决"…

2026/9/23 15:43:19 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →