HarmonyOS应用开发实战:萌宠日记 - 参数化路由
HarmonyOS应用开发实战萌宠日记 - 参数化路由前言在萌宠日记中参数化路由是页面间数据传递的另一种重要方式。与回调函数模式不同参数化路由通过NavPathStack.pushPath的param参数传递数据目标页面在NavDestination中接收。这种方式适用于父 → 子或跨页面栈的数据传递场景。本文将从萌宠日记的路由参数传递实践出发深入解析参数化路由的定义、传递、接收完整流程以及不同类型参数的传递策略。一、参数化路由概述1.1 什么是参数化路由参数化路由是指在页面跳转时携带参数目标页面在渲染时接收这些参数从而实现数据传递。// 父页面跳转时携带参数 this.homeStack.pushPath({ name: petProfile, param: { petId: 123, petName: 豆豆 } }) // 目标页面在 NavDestination 中接收参数 NavDestination() { PetProfilePage({ petId: 123, petName: 豆豆 }) } .title(宠物档案)1.2 参数传递的两种模式模式方向传递方式适用场景回调函数子 → 父属性传 lambda子组件通知父组件参数化路由父 → 子pushPath 的 param跳转时传递初始数据二、pushPath 参数详解2.1 NavPathInfo 结构// NavPathStack.pushPath 的参数类型 interface NavPathInfo { name: string // 目标页面名称必填 param?: Object // 传递给页面的参数可选 onPop?: () void // 页面出栈回调可选 } // 完整示例 this.homeStack.pushPath({ name: petProfile, param: { petId: 123, petName: 豆豆, petBreed: 比熊犬, petAge: 2岁3个月 }, onPop: () { console.log(Returned from pet profile page) } })2.2 参数类型参数类型说明示例string字符串petId: 123number数字age: 27boolean布尔值isVaccinated: trueObject对象{ name: 豆豆, breed: 比熊犬 }Array数组tags: [活泼, 黏人]提示param是Object类型可以传递任意 JSON 可序列化的数据。但需要注意不要传递过大的数据如图片二进制数据否则会影响页面跳转性能。三、参数接收方式3.1 通过 NavDestination 属性传递Builder HomeNavDestinations() { NavDestination() { PetProfilePage({ petId: 123, petName: 豆豆 }) } .title(宠物档案) }3.2 通过 NavPathStack 获取参数// 在目标页面中获取当前页面的参数 Builder HomeNavDestinations() { NavDestination() { PetProfilePage() } .title(宠物档案) .onReady(() { // 获取当前页面的参数 const params this.homeStack.getParamByName(petProfile) console.log(Pet profile params:, JSON.stringify(params)) }) }3.3 参数获取方法方法说明返回值getParamByName(name)按页面名称获取参数ObjectgetPathParams()获取栈中所有页面参数ArrayObject四、参数传递的完整链路4.1 从点击到数据接收用户点击宠物档案 ↓ HomePage 回调 → Index 执行 pushPath ↓ pushPath({ name: petProfile, param: { petId: 123 } }) ↓ Navigation 检测到路径变化 ↓ 渲染 NavDestination → PetProfilePage ↓ PetProfilePage 接收 param 中的 petId ↓ 使用 petId 加载对应宠物的数据4.2 代码实现// 1. Index.ets — 发起跳转并传递参数 HomePage({ onNavigateToPetProfile: () { this.homeStack.pushPath({ name: petProfile, param: { petId: 123, petName: 豆豆 } }) } }) // 2. HomeNavDestinations — 渲染参数到页面 Builder HomeNavDestinations() { NavDestination() { PetProfilePage({ petId: 123, petName: 豆豆 }) } .title(宠物档案) } // 3. PetProfilePage.ets — 接收参数 export struct PetProfilePage { private petId: string private petName: string build() { Column() { Text(this.petName) .fontSize(22).fontWeight(FontWeight.Bold) // 使用 petId 加载更多数据... } } }五、动态参数传递5.1 基于状态传递参数// 从当前状态中动态获取参数 HomePage({ onNavigateToPetProfile: () { const currentPet this.getCurrentPet() // 动态获取宠物数据 this.homeStack.pushPath({ name: petProfile, param: { petId: currentPet.id, petName: currentPet.name, petAge: currentPet.age } }) } })5.2 参数动态更新// 在 onShown 中检查参数变化 Builder HomeNavDestinations() { NavDestination() { PetProfilePage() } .title(宠物档案) .onShown(() { // 每次页面显示时重新获取参数 const params this.homeStack.getParamByName(petProfile) if (params) { // 更新页面数据 console.log(Updated params:, JSON.stringify(params)) } }) }六、参数验证与默认值6.1 参数验证export struct PetProfilePage { private petId: string private petName: string aboutToAppear(): void { // 验证参数有效性 if (!this.petId) { console.error(Missing petId parameter) // 可以显示错误页或返回 } } }6.2 默认值设置export struct PetProfilePage { private petId: string default // 默认值 private petName: string 未知宠物 // 默认值 private petAge: string 未知 // 默认值 }七、onPop 回调7.1 出栈回调// 在跳转时注册出栈回调 this.homeStack.pushPath({ name: petProfile, param: { petId: 123 }, onPop: () { // 从宠物档案页返回时的回调 console.log(Returned from pet profile) this.refreshHomePage() // 刷新首页数据 } })7.2 回调的应用场景场景onPop 回调说明数据刷新返回后刷新列表子页面可能修改了数据状态同步返回后同步状态子页面可能改变了全局状态埋点统计记录页面停留时间统计用户行为取消订阅返回后清理资源释放子页面中的资源八、复杂参数传递8.1 嵌套对象// 传递复杂嵌套对象 this.homeStack.pushPath({ name: petProfile, param: { pet: { id: 123, name: 豆豆, breed: 比熊犬, gender: male, birthDate: 2022-02-14, weight: 4.5, characteristics: [活泼, 黏人, 贪吃] }, owner: { name: 萌宠家长, avatar: default_avatar } } })8.2 参数大小限制参数类型建议大小说明简单类型无限制string, number, boolean对象≤ 10KB大量数据建议使用 AppStorage数组≤ 100 项长列表建议使用数据仓库二进制数据不要传递使用文件路径或 URL 引用九、参数化路由 vs 全局状态9.1 选择策略场景推荐方式理由页面初始化数据参数化路由生命周期清晰随页面一起传递跨页面共享数据AppStorage全局访问无需逐层传递用户输入表单参数化路由编辑页面的初始值配置信息AppStorage多处使用全局共享9.2 组合使用// 参数化路由 AppStorage 组合使用 // 1. 路由参数传递核心标识 this.homeStack.pushPath({ name: petProfile, param: { petId: 123 } }) // 2. 目标页面通过 petId 从 AppStorage 获取完整数据 StorageProp(petData) petData: PetData {} aboutToAppear(): void { const petId this.getPetIdFromRoute() this.petData this.loadPetDataFromStorage(petId) }十、最佳实践10.1 参数传递规范有序列表 — 参数化路由的 5 个规范参数最小化只传递必要的数据标识大数据通过全局存储获取类型明确使用接口定义参数结构保证类型安全默认值为所有参数提供合理的默认值参数验证在 aboutToAppear 中验证参数有效性避免敏感数据不在路由参数中传递密码、Token 等敏感信息10.2 常见问题问题原因解决方案参数丢失pushPath 时未正确传递 param检查 pushPath 参数格式参数类型错误传递的类型与接收类型不匹配使用接口定义参数类型参数未更新页面已缓存参数只在首次生效在 onShown 中重新获取参数参数过大传递了大数据对象使用 AppStorage 或文件路径替代总结本文从萌宠日记的参数化路由实践出发深入解析了页面间数据传递的完整实现参数化路由通过 pushPath 的 param 传递数据NavPathInfo 结构name、param、onPop 三个字段参数接收NavDestination 属性传递或 getParamByName 获取完整链路从点击触发到目标页面接收参数的完整流程动态参数基于状态动态构建参数参数验证默认值设置和有效性检查onPop 回调页面返回时的处理逻辑复杂参数嵌套对象传递和大小限制参数化路由与回调函数模式相辅相成共同构成了萌宠日记完整的页面间数据传递体系。下一篇我们将深入底部导航栏固定模式与自适应解析 BarMode 的配置与选择策略。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源页面路由参数传递https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-routingNavPathStack 开发指导https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-navigation-navigationNavDestination 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navdestinationState 装饰器https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-stateAppStorage 全局存储https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-appstorage组件间通信https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-component-encapsulationNavigation 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navigation页面生命周期https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-page-lifecycle

相关新闻

深入解析qsort与冒泡排序

深入解析qsort与冒泡排序

目录 一,qsort函数 二,模仿qsort函数,利用冒泡排序排序任意类型的数据 三,sizeof和strlen对比 四,指针例题 1,指针-整数 2,指针-指针 3,指针复杂计算案例 一,qsort…

2026/9/25 16:39:23 阅读更多 →
HarmonyOS应用开发实战:萌宠日记 - 自定义 TabBar 设计与图标渲染

HarmonyOS应用开发实战:萌宠日记 - 自定义 TabBar 设计与图标渲染

HarmonyOS应用开发实战:萌宠日记 - 自定义 TabBar 设计与图标渲染 前言 TabBar 是底部导航栏的 视觉呈现核心,它直接影响用户对应用的第一印象和操作体验。在 萌宠日记 中,我们使用 Builder 装饰器 自定义了 TabBar 的渲染方式,实…

2026/10/3 5:57:40 阅读更多 →
第四篇:《函数、指针与结构体:组织代码的核心工具》

第四篇:《函数、指针与结构体:组织代码的核心工具》

变量是代码的“名词”,函数是代码的“动词”。在 Go 语言中,函数是第一公民,支持多返回值、命名返回值和闭包。指针提供了对内存的间接访问能力,但 Go 的指针比 C 更安全——不支持指针算术。结构体(struct&#xff09…

2026/9/26 0:48:10 阅读更多 →

最新新闻

Hadoop电影推荐系统项目实战:从源码拆解到避坑指南

Hadoop电影推荐系统项目实战:从源码拆解到避坑指南

简介:基于 Hadoop 的电影推荐系统完整项目,覆盖数据采集、离线计算与在线推荐全流程,适合计算机相关专业学生用于毕业设计、课程设计或项目初期演示,也方便初学者进阶学习。项目含推荐算法、爬虫采集、Web展示与后台管理等功能模块…

2026/10/3 9:42:09 阅读更多 →
03_01_24项目复盘:数据库升级与凌晨迁移的流程控制与坑点

03_01_24项目复盘:数据库升级与凌晨迁移的流程控制与坑点

1. 为什么用“03_01_24”当项目代号 先把这个标题拆开来看: 03_01_24 不是随便敲的一串字符,在我这里它代表 2024年3月1日24:00 启动的一个维护窗口项目。按惯例,这种以时间戳命名的项目基本不用记业务名称,直接看编号就知道是…

2026/10/3 9:42:09 阅读更多 →
跨架构离线交付:Docker pull 指定架构镜像保存与加载实践

跨架构离线交付:Docker pull 指定架构镜像保存与加载实践

在做离线交付和跨架构部署时,Docker 拉取指定架构镜像再保存到本地,是绕不开的一步。很多人刚开始接触这个操作时,以为 docker pull 拉下来的镜像就一定能在目标机器上跑,结果 docker save 打包带过去,一运行就报 exec…

2026/10/3 9:42:09 阅读更多 →
给LLM Agent装上后视镜:基于MCP与Docker的时序记忆系统实战

给LLM Agent装上后视镜:基于MCP与Docker的时序记忆系统实战

1. 从“hindsight”说起:为什么我们需要给Agent装一个“后视镜”“hindsight”这个词本身很有意思,字面意思是“事后的洞察力”,也就是我们常说的“后见之明”。放在AI Agent的语境里,它指向一个非常具体且关键的问题:…

2026/10/3 9:42:09 阅读更多 →
AURIX TC3xx PMS电源管理解析:复位与低功耗避坑指南

AURIX TC3xx PMS电源管理解析:复位与低功耗避坑指南

做AURIX TC3xx开发这几年,我踩过最隐蔽的坑基本都集中在PMS,也就是Power Management System。很多人刚开始接触这颗芯片时,习惯性地把它当成普通MCU来用:上电、配时钟、初始化外设,一切正常,直到某天发现芯…

2026/10/3 9:42:09 阅读更多 →
Agent记忆系统实战:基于MCP与Docker的hindsight方案

Agent记忆系统实战:基于MCP与Docker的hindsight方案

1. 从“hindsight”说起:为什么记忆是 Agent 落地的最后一公里第一次看到 “hindsight” 这个词,是在一个做智能体(Agent)的朋友群里。有人丢了一张截图,说他们的 Agent 在连续对话到第 40 轮之后开始“胡言乱语”&…

2026/10/3 9:41:09 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →