【鸿蒙心迹】HarmonyOS笔记23:返回导航与状态恢复
发布时间:2026/11/5 1:48:55 锦皓数字建站

个人主页杨利杰YJlio❄️个人专栏《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》《超简单用Python让Excel飞起来》让复杂的事情更简单让重复的工作自动化文章目录一、返回后先检查是不是原来的页面状态二、保留首页的计数逻辑三、用 pushUrl 保留首页的页面栈位置四、详情页通过 back 返回上一页五、把状态保留与新建页面的初值分开看六、重新显示不等于重新创建七、页面保留与跨重启持久化分别处理八、沿完整路径记录进入前与返回后写在最后参考资料大家好我是杨利杰 YJlio。前两节整理了页面跳转与参数传递。这一节回到原稿的 count 示例先增加数量再进入详情页返回后检查数量。通过这个小练习我想分清“原页面仍在”与“页面重新创建”两种情况。本篇编号 023计划日期为 2026 年 10 月 13 日。原稿已保留下方双页面代码是补充的学习示例尚未在本机编译或设备运行。配图均为概念示意。一、返回后先检查是不是原来的页面状态本例让首页 Index 持有 count详情页 Detail 只提供返回按钮。进入详情前记录 count返回后再次读取首页上的数量。这次没有修改详情数据也没有把 count 传给详情页。重点是观察原首页状态而不是练习页面间回传结果。二、保留首页的计数逻辑原稿将 count 初始值设为 0点击“增加”后加 1。我保留这一点再添加进入详情的按钮与跳转失败提示。首页 Index.ets 示例import{BusinessError}fromkit.BasicServicesKit;EntryComponentstruct Index{Statecount:number0;Statemessage:string;aboutToAppear():void{console.info(Index aboutToAppear count${this.count});}onPageShow():void{console.info(Index onPageShow count${this.count});}privateopenDetail():void{this.message;this.getUIContext().getRouter().pushUrl({url:pages/Detail},(err:BusinessError){if(err){this.message跳转失败;console.error(pushUrl failed:${err.code},${err.message});}});}build(){Column({space:12}){Text(当前数量${this.count})Text(this.message)Button(增加).onClick((){this.count1})Button(查看详情).onClick((){this.openDetail()})}.width(100%).padding(16)}}两处生命周期日志只记录状态没有给 count 重新赋值。日志文本是观察入口不是已经获取的运行日志。三、用 pushUrl 保留首页的页面栈位置本例仍使用上一节的 pages/Index 与 pages/Detail 两个注册名称。它们对应各自的页面文件实际配置需核对当前模块的 main_pages.json 等页面清单不覆盖已有注册内容。官方 Router 文档说明pushUrl 会把目标页加入页面栈同时保留当前页。本例进入详情后Index 在下面Detail 在上面。如果首页没有被销毁、重建或主动清空状态返回时应检查的是原来这份 count。换成 replaceUrl 会改变页面栈关系不能继续按同一个保留页面的前提推断。四、详情页通过 back 返回上一页详情页 Detail.ets 示例EntryComponentstruct Detail{build(){Column({space:12}){Text(详情页)Button(返回).onClick((){this.getUIContext().getRouter().back()})}.width(100%).padding(16)}}Index 和 Detail 分别放在两个页面文件中。这里的返回依赖页面栈中存在上一页直接启动详情页时不能假定 back 一定能回到首页。返回到哪个页面应根据当前页面栈判断返回按钮的文字不决定目标。五、把状态保留与新建页面的初值分开看在本例的预期路径中首页 count 增加后通过 pushUrl 暂时不显示再通过 back 回到原首页应核对它是否仍保留离开时的数值。新建一个 Index 实例时字段声明的 count 初始值仍为 0。两个页面都显示“首页”并不意味着它们是同一个实例。场景我需要检查什么返回仍保留的 Index原 count 是否仍在是否有代码改写新建 Index是否从声明的初值开始用 replaceUrl 替换页面原页面是否已不在栈中返回后主动重新加载数据新数据是否覆盖了原来的显示状态页面看起来一样不代表页面实例和状态来源一样。六、重新显示不等于重新创建onPageShow 用于观察页面显示aboutToAppear 属于自定义组件生命周期在新实例创建后的构建阶段执行。两者承担的观察职责不同。如果在 onPageShow 中每次都把 count 写成 0返回后也可能被自己的代码重置。这时需要检查赋值位置不能直接归因于框架没有保存状态。本例仅记录日志方便对照进入、返回与新建过程。具体回调顺序和触发次数仍需在自己的工程中观察不要从一张概念图推断完整生命周期时序。七、页面保留与跨重启持久化分别处理State count 是本例组件中的状态它没有写入 Preferences、文件或数据库。因此本篇没有实现跨应用重启的保存与恢复。如果希望下次启动仍恢复数量需要明确保存时机、读取时机、默认值及失败处理。后续会分别学习相应存储机制这节先保持计数与返回路径最小化。本文继续使用 Router 练习页面栈。官方资料推荐新项目使用 Navigation迁移时应按对应体系重新核对返回关系与状态归属。八、沿完整路径记录进入前与返回后操作预期或需记录内容当前状态新建首页当前数量0待实际验证点击增加一次当前数量1待实际验证点击查看详情进入 Detail记录首页离开时 count待实际验证点击返回检查返回目标及原 count 是否保留待实际验证重复进入与返回对照状态和生命周期日志待实际验证重启应用对照区分重新创建与原页面返回待实际验证环境记录应包含实际 DevEco Studio、SDK/API、设备与窗口。如果数量变化不符合预期保存完整日志和操作顺序列出所有给 count 赋值的位置。代码采用 V1 的 Component、State 和相应 Router 接口当前工程若使用其他模板应先适配。系列名称不代表任何指定 SDK 的编译验证。先确认返回目标再确认页面是否重建最后追踪状态的所有赋值来源。写在最后这节我用 count 把返回问题拆成了三个检查点页面栈是否保留首页、返回是否回到原实例、数量是否被其他代码覆盖。标题中的“状态恢复”在本例主要体现为返回后重新看到原状态跨重启恢复与持久化仍是后续内容。下一篇学习表单输入校验与提交反馈继续记录输入、操作和可观察结果。参考资料OpenHarmony 官方文档页面路由用于核对 pushUrl、back、页面显示生命周期与 Navigation 推荐说明。OpenHarmony 官方文档自定义组件生命周期用于区分组件创建与页面显示实际 HarmonyOS 工程以对应 SDK 文档为准。本系列第 023 篇原稿《返回导航与页面状态恢复》计划日期 2026-10-13。声明本文为个人学习笔记代码与概念配图用于说明返回路径和状态检查未执行本机编译或设备实测日志与预期结果不能当作运行证据。返回顶部
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。